zoukankan      html  css  js  c++  java
  • 改ucosii的中断禁止和恢复代码,这是一个荒谬的错误【 mrs msr】

    ucosii原来的禁止中断以及恢复中断的代码是最简的,但是使用之前,必须声明一个固定名为 OS_CPU_SR   cpu_sr 的变量,吊在那里感觉很怪。

    ;*************************************************
    ; Note(s)    : These functions are used in general like this:
    ;                 void Task (void *p_arg)
    ;                 {
    ;                 #if OS_CRITICAL_METHOD == 3          /* Allocate storage for CPU status register */
    ;                     OS_CPU_SR  cpu_sr;
    ;                 #endif
    ;                          :
    ;                     OS_ENTER_CRITICAL();             /* cpu_sr = OSCPUSaveSR();                */
    ;                          :
    ;                     OS_EXIT_CRITICAL();              /* OSCPURestoreSR(cpu_sr);                */
    ;                          :
    ;                 }
    ;*************************************************
    OSCPUSaveSR
        MRS     R0, CPSR                ; Set IRQ and FIQ bits in CPSR to disable all interrupts
        ORR     R1, R0, #0xC0               
        MSR     CPSR_c, R1                  ;cpsr = cpsr_0 | 0xc0
        MRS     R1, CPSR                ; Confirm that CPSR contains the proper interrupt disable flags
        AND     R1, R1, #0xC0               
        CMP     R1, #0xC0                   ;if( (cpsr_1 &0xc0) = 0xc0){ return }else { redo OSCPUSaveSR() }
        BNE     OSCPUSaveSR                ; Not properly disabled (try again)
        MOV     PC, LR                    ; Disabled, return the original CPSR contents in R0
    
    OSCPURestoreSR
        MSR     CPSR_c, R0
        MOV     PC, LR
    
    ;***************************************************
    #if OS_CRITICAL_METHOD == 3 #define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR()) /* Disable interrupts */ #define OS_EXIT_CRITICAL() (OSCPURestoreSR(cpu_sr)) /* Restore interrupts */ #endif

    改了下,这样可以如下使用这个功能: [这是一个荒谬而明显的错误, 但我还是把他留下来了,提醒我不要自作聪明.]

    ;***********************************************
    ;My OSEnterCritical && OSExitCritical oucaijun
    ;void OSEnterCritical (unsigned int *pSave);
    ;void OSExitCritical (unsigned int *pSave);
    ; Useage:
    ; OS_CPU_SR sr_save;
    ; OSEnterCritical(&sr_save);
    ; your_function_not_allow_interrupted
    ; OSExitCritical(&sr_save);
    ;***********************************************
    ;NOINT EQU 0xc0
    
    OSEnterCritical
        ;write and save
        mrs r1, cpsr
        str r1,[r0]
        orr r1, r1, #NOINT
        msr cpsr_c, r1
        ;read and compare,judge if set_i_f successfully
        mrs r1,cpsr
        and r1,r1,#NOINT
        cmp r1,#NOINT
        bne OSEnterCritical
        mov pc, lr
        
    OSExitCritical
        ldr r1,[r0]
        msr cpsr_c, r1
        mov pc, lr
    ;***********************************************

    仍要配对使用。

    msr /msr的名称, 符合向左移动数据的习惯。

    msr :  r to cpsr

    msr cpsr_c, r1

    mrs :   cpsr to r

    mrs r1, cpsr_c  
  • 相关阅读:
    哈夫曼树及哈夫曼编码
    01背包问题
    Java IO
    Java对象的复制三种方式
    TCP三次握手和四次挥手
    轻量级Java Web框架的实现原理
    Java并发
    消息队列
    赋值、浅拷贝、深拷贝
    Python文件操作(txtxlsxcsv)及os操作
  • 原文地址:https://www.cnblogs.com/mylinux/p/4180102.html
Copyright © 2011-2022 走看看