⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 system.h

📁 一个简单实用的嵌入式操作系统,实现了嵌入式操作系统的基本模块:内存管理、系统调度 、系统调用等。
💻 H
字号:
/*
 *  include/asm-cc/gcc/system.h
 *
 *  Copyright (C) 2007/12/10 Wang Qiang
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * histroy:
 *  2008/04/23, wang qiang, rurality@gmail.com 
 *      1) add the en_cpsr_irq, dis_cpsr_irq
 *      2) modify en_spsr_irq, dis_cpsr_irq ,change r0 into %0,to save the context
 *          I found this problem under simlation envirment and report it to the gcc
 *          But I think is is not the gcc bug,It is my mistake
 *
 */


#ifndef _SYSTEM_H_
#define _SYSTEM_H_

// flush the I-Cache
#define     icache_clear \
    __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 0 " ::"r"(0) )
// flush the D-Cache
#define     dcache_clear \
    __asm__ __volatile__ ("mcr p15, 0, %0, c7, c6, 0 " ::"r"(0) )
// flush the I-Cache & D-Cache
#define     cache_clear \
    __asm__ __volatile__ ("mcr p15, 0, %0, c7, c7, 0 " ::"r"(0) )

#define     iskernel() ({       \
    register int __res;         \
    __asm__ __volatile__ (      \
        "mrs %0,cpsr \n\t"      \
        "ands %0,%0,#0xF \n\t"  \
        "eorne %0,%0,#0xF \n\t" \
        :"=r"(__res)            \
    );                          \
   __res;                       \
})

#define     isirq() ({          \
    register int __res;         \
    __asm__ __volatile__ (      \
        "mrs %0,cpsr \n\t"      \
        "and  %0,%0,#0xF \n\t"  \
        "cmp  %0, #0x1 \n\t"    \
        "movne %0, #0 \n\t"     \
        :"=r"(__res)            \
    );                          \
   __res;                       \
})

#define en_spsr_irq() ({        \
    register int __temp;        \
    __asm__ __volatile__ (      \
        "mrs %0,spsr \n\t"      \
        "bic %0,%0,#0x80 \n\t"  \
        "msr spsr_c, %0 \n\t"   \
        :"=r"(__temp));         \
})

#define dis_spsr_irq() ({       \
    register int __temp;        \
    __asm__ __volatile__ (      \
        "mrs %0,spsr \n\t"      \
        "orr %0,%0,#0x80 \n\t"  \
        "msr spsr_c, %0 \n\t"   \
        :"=r"(__temp));         \
})

#define en_cpsr_irq() ({        \
    register int __temp;        \
    __asm__ __volatile__ (      \
        "mrs %0,cpsr \n\t"      \
        "bic %0,%0,#0x80 \n\t"  \
        "msr cpsr_c, %0 \n\t"   \
        :"=r"(__temp));         \
})

#define dis_cpsr_irq() ({       \
    register int __temp;        \
    __asm__ __volatile__ (      \
        "mrs %0,cpsr \n\t"      \
        "orr %0,%0,#0x80 \n\t"  \
        "msr cpsr_c, %0 \n\t"   \
        :"=r"(__temp));         \
})

//unsigned int do_div(unsigned int *n,unsigned int base)
//{
//    unsigned int __res;
//    switch(base) {
//        case 8,16:
//            power of 2 dividor is special
//            *n = *n % 2^n        remaider
//            __res = *n/2^n        dividend
//            break;
//        case 10:
//            use the magic number 0xCCCCCCCD,to convert
//            div into mul
//            break;
//        default:
//            other return 35(Z)
//            break;
//    }
//    return __res;
//}

#define do_div(n,base) ({                   \
    register unsigned int __res;            \
    register unsigned int reg0=0,reg1=0;    \
    __asm__ __volatile__(                   \
        "cmp     %4, #16 \n\t"              \
        "beq     16f \n\t"                  \
        "cmp     %4, #10 \n\t"              \
        "beq     10f \n\t"                  \
        "cmp     %4, #8 \n\t"               \
        "beq     8f \n\t"                   \
        "b       0f \n\t"                   \
        "8:      \n\t"                      \
        "and     %0, %1, #7 \n\t"           \
        "mov     %1, %1, asr #3 \n\t"       \
        "b       9999f \n\t"                \
        "10:     \n\t"                      \
        "ldr     %2,=0xCCCCCCCD \n\t"       \
        "umull   %0, %3, %2, %1 \n\t"       \
        "mov     %2, %3, lsr #3 \n\t"       \
        "add     %3, %2, %2, lsl #2 \n\t"   \
        "sub     %0, %1, %3, lsl #1 \n\t"   \
        "mov     %1, %2 \n\t"               \
        "b       9999f \n\t"                \
        "16:      \n\t"                     \
        "and     %0, %1, #15 \n\t"          \
        "mov     %1, %1, lsr #4 \n\t"       \
        "b       9999f \n\t"                \
        "0:      \n\t"                      \
        "mov     %0, #35 \n\t"              \
        "mov     %1, #0 \n\t"               \
        "9999:   \n\t"                      \
        :"=&r"(__res),"+&r"(*n)             \
        , "=r"(reg0),"=r"(reg1)             \
        : "r"(base)                         \
        :"cc"                               \
    );                                      \
    __res;                                  \
})

#define bit_rotate(data,bit) ({            \
    register unsigned int __mid=0;         \
    __asm__ __volatile__(                  \
        "mov %3, %2, LSR %1 \n\t"          \
        "1:"                               \
        "cmp %3, #0 \n\t"                  \
        "beq 2f \n\t"                      \
        "add %0, %0, #1 \n\t"              \
        "tst %3, #1 \n\t"                  \
        "moveq %3, %3, LSR #1 \n\t"        \
        "beq 1b \n\t"                      \
        "b 3f \n\t"                        \
        "2:"                               \
        "mov %0, #32 \n\t"                 \
        "3:"                               \
        : "=&r"(bit)                       \
        : "0"(bit),"r"(data), "r"(__mid)   \
        : "cc"                             \
    );                                     \
    bit;                                   \
})


#endif // _SYSTEM_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -