改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  
时间: 2024-10-16 13:31:20

改ucosii的中断禁止和恢复代码 【 mrs msr】的相关文章

HTML中使用javascript解除禁止input输入框代码:

转:表单中Readonly和Disabled的区别 参考资料: disabled和readonly区别: 参考博文1地址:http://blog.csdn.net/symgdwyh/article/details/5342937 两种属性的写法如下: 1.<input type="text" name="name" value="xxx" disabled="true"/> 2.<input type=&qu

【汇编】三种方法实现装填中断子程序地址的代码

1 CODE SEGMENT 2 ASSUME CS:CODE 3 INT_50H PROC FAR 4 MOV CX,1000H 5 L: LOOP L 6 IRET 7 INT_50H ENDP 8 BEGIN: 9 PUSH DS 10 MOV AX,0 11 MOV DS,AX 12 MOV WORD PTR DS:[140H],OFFSET INT_50H 13 MOV WORD PTR DS:[142H],SEG INT_50H 14 MOV AH,4CH 15 INT 21H 16

二十三、详述 IntelliJ IDEA 中恢复代码的方法「进阶篇」

咱们已经了解了如何将代码恢复至某一版本,但是通过Local History恢复代码有的时候并不方便,例如咱们将项目中的代码进行了多处修改,这时通过Local History恢复代码就显得很麻烦,因为它更倾向于恢复某一个文件的修改. 因此,如果咱们的项目是通过Subversion也就是SVN检出的,那么咱们就多了一种恢复代码的方法,即通过Subversion进行Revert操作. 操作步骤: 标注1:项目名称 标注2:Subversion 标注3:Revert 如上图所示,先鼠标右键点击项目名称,

CSS改网页鼠标指针、改指定元素指针(1)——代码部分

要实现CSS改网页鼠标指针.改指定元素指针,我们应该首先了解以下内容: 所有主流浏览器都支持 cursor 属性. 注释:Opera 9.3 和 Safari 3 不支持 url 值. 注释:任何版本的 Internet Explorer (包括 IE8)都不支持属性值 "inherit". 定义和用法 cursor 属性规定要显示的光标的类型(形状). 该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状(不过 CSS2.1 没有定义由哪个边界确定这个范围). 默认值: aut

禁止拷贝网页代码,禁止复制粘贴

// 禁止右键查看源代码<body oncontextmenu="window.event.returnValue=false">//禁止拷贝代码,不能选中内容 <div onselectstart="return false">不能拷贝</div>//禁止粘贴到input中 <input type="text" onpaste="return false" />

博客园禁止手动复制代码

代码如下:将其粘贴到博客园文本中,就可以禁止手动复制 <script language="Javascript"> document.oncontextmenu=new Function("event.returnValue=false"); document.onselectstart=new Function("event.returnValue=false"); </script> 原文地址:https://www.

安卓mbn文件丢失,无法搜索移动信号,工程模式mbn乱改,不用QPST烧录怎样恢复?超简单!

没有root,工程模式乱改mbn配置选项,导致mbn配置丢失,无法搜索移动网络. 重启若干次改配置都无效,清空网络设置无效,恢复出厂无效,recovery三清无效, 不太想拆机root麻烦,QPST配置也不太会,不愿弄. 解决方法实际上挺简单,亲测可用: 1用云服务或者特制app备份手机的资料照片文档等等 2按照手机论坛的刷机步骤,选择适合的官方线刷包,线刷才能解决. 原文地址:https://www.cnblogs.com/-fresh/p/11407638.html

禁止复制粘贴代码

<body oncontextmenu=" window.event.returnValue=false" onkeypress="window.event.returnValue=false" onkeydown="window.event.returnValue=false" onkeyup="window.event.returnValue=false" ondragstart="window.event

转:【Java并发编程】之二:线程中断(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17091267 使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行. 下面一段代码演示了休眠线程的中断: [java] view plain c