• uc/os中断处理


    //c语言,基于x86处理器的uc/os-II开中断和关中断的洪定义
    #if OS_CRITICAL_METHOD==1
    #define OS_ENTER_CRITICAL() asm CLI;
    #define OS_EXIT_CRITICAL() asm STI;
    #endif

    #if OS_CRITICAL_METHOD==2
    #define OS_ENTER_CRITICAL() asm {PUSHF;CLI}
    #define OS_EXIT_CRITICAL() asm POPF
    #endif


    #if OS_CRITICAL_METHOD==3
    #define OS_ENTER_CRITICAL() asm (cpu_sr=OSCPUSaveSR())
    #define OS_EXIT_CRITICAL() asm (OSCPURestoreSR(cpu_sr))
    #endif


    //基于ARM 处理器的ucos-ii开中断和关中断洪定义由C 和汇编语言两部分组成
    #define OS_CPU-SR unsigned long
    #define os_ENTER_CRITICAL() {cpu_sr=INTS_OFF())
    #define OS_EXIT_CRITICAL() (if(cpu_sr==0) INTS_ON();}

    ;;;===OS_CPU_A.S汇编程序部分===
    EXPORT INTS_OFF
    EXPORT INTS_ON
    INTS_OFF
    mrs ro,cpsr; CPSR的值送人R0
    mov r1,r0; R0的值备份R1
    orr r1,r1,#0xC0 R1的bit7和bit6置1
    msr CPSR_cxsf,r1 将R1存入CPSR
    and r0,r0,#0x80 R0保存了IRQ原状态
    mov pc,lr 返回
    INTS_ON
    mrs r0,cpsr CPSR的值存入R0
    bic r0,r0,#0x80 清除IRQ标志
    msr CPSR_cxsf,r0 IRQ使能
    mov pc,lr 返回


    //ucos-ii进入和退出临界区的范例
    void OSIntEnter(void)
    {
    #if OS_CRITICAL_METHOD==3
    OS_CPU_SR cpu_sr; //为CPU状态寄存器分配存储区
    #endif
    OS_ENTER_CRITICAL();
    if(OSIntNesting<255)
    OSIntNesting++; //中断服务子程序嵌套计数之加1
    OS_EXIT_CRITICAL();
    }
    Live together,or Die alone!
  • 相关阅读:
    每日博客
    每日博客
    每日博客
    每日博客
    每日博客
    每日博客
    每日博客
    每日博客
    centos7 systemctl 管理MySQL
    Postgresqlz之迁移数据pg_dump
  • 原文地址:https://www.cnblogs.com/hzhida/p/2395675.html
Copyright © 2020-2023  润新知