ARM Cortex M4-当PRIMASK设置为1时,SysTick中断请求会发生什么变化?

ARM Cortex M4-当PRIMASK设置为1时,SysTick中断请求会发生什么变化?,arm,semaphore,interrupt,rtos,cortex-m,Arm,Semaphore,Interrupt,Rtos,Cortex M,我正在学习RTOS,我在一个讨论信号量的部分。这本书实现了一个自旋锁信号量,但我很难理解SysTick会发生什么,它用于实现上下文切换 void OS_Wait(int32_t *s){ while( (*s) == 0 ) { EnableInterrupts(); //Does SysTick "wait" until this line? Disableinterrupts(); } (*s) = (*s) - 1; EnableInter

我正在学习RTOS,我在一个讨论信号量的部分。这本书实现了一个自旋锁信号量,但我很难理解SysTick会发生什么,它用于实现上下文切换

 void OS_Wait(int32_t *s){
  while( (*s) == 0 )
  {
       EnableInterrupts(); //Does SysTick "wait" until this line?
       Disableinterrupts();
  }
  (*s) = (*s) - 1;
  EnableInterrupts();
}
EnableInterrupts()是一个汇编子程序

 EnableInterrupts
  CPSIE I
  BX LR
我的另一本ARM手册上说CPSIE I的等效代码是

MOVS r0, #0
MSR PRIMASK, r0
我在其他地方问过这个问题,我从其中一个答案中的理解是,特定中断的RIS值在服务完成之前保持较高,因为它们必须在处理程序中设置为0,所以请求有点“等待”直到中断再次启用。我不确定这是否正确。SysTick怎么了?它没有请求其处理程序的RIS位。那么,当中断被禁用时,SysTick到底发生了什么?我阅读了我的电路板(TM4C123)的参考手册,上面说每次发生中断时STCTRL寄存器计数位都会上升。这是不是相当于RIS位?参考手册没有明确说明这一点。谢谢大家!

编辑:我看了参考手册。PRIMASK的值为1以禁用所有具有可配置优先级的异常,因此我认为前面的代码是一个错误。应该是1

MOVS r0, #1
MSR PRIMASK, r0
编辑:修正了打字错误

arm文档状态

The CPSIE i instruction is equivalent to writing a 0 into PRIMASK.
The CPSID i instruction is equivalent to writing a 1 into PRIMASK.
The CPSIE f instruction is equivalent to writing a 0 into FAULTMASK.
The CPSID f instruction is equivalent to writing a 1 into FAULTMASK.
试试看

.equ GPIOEBASE, 0x40021000
.equ RCCBASE  , 0x40023800
.equ STK_BASE , 0xE000E000

.thumb

.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word systick_handler


.thumb_func
reset:
    ldr r0,=RCCBASE
    ldr r1,[r0,#0x30]
    ldr r2,=0x00000010
    orr r1,r2
    str r1,[r0,#0x30]

    ldr r0,=GPIOEBASE

    ldr r1,[r0,#0x00]
    ldr r2,=0x00000003
    bic r1,r2
    ldr r2,=0x00000001
    orr r1,r2
    str r1,[r0,#0x00]

    ldr r1,[r0,#0x04]
    ldr r2,=0x00000001
    bic r1,r2
    str r1,[r0,#0x04]

    ldr r1,=0x00000001
    str r1,[r0,#0x18]

    ldr r2,=STK_BASE
    ldr r3,=0x00004;
    str r3,[r2,#0x10]
    ldr r3,=0x10000;
    str r3,[r2,#0x14]
    ldr r3,=0x0000;
    str r3,[r2,#0x18]
    ldr r3,=0x00007;
    str r3,[r2,#0x10]

    ldr r3,=0
    msr PRIMASK,r3

.thumb_func
hang:   b .

.thumb_func
systick_handler:
    ldr r1,=0x00010000
    str r1,[r0,#0x18]
    b .
.align
.word 0x12345678
.end
led亮起

ldr r3,=1
msr PRIMASK,r3
led不亮

cpsie i
引导

cpsid i
引导

cpsid/cpsie是小型单指令

 8000076:   2300        movs    r3, #0
 8000078:   f383 8810   msr PRIMASK, r3
 800007c:   b662        cpsie   i
 800007e:   2301        movs    r3, #1
 8000080:   f383 8810   msr PRIMASK, r3
 8000084:   b672        cpsid   i

我会使用cpsid/cpsie。

In
int32_t*2
2
不是有效的符号名。你需要确保你发布的是真实的代码——当很明显代码无效时,回答问题是非常困难的,因此与你提问的代码不完全相同。谢谢你指出错误。这并不是问一个关于代码的问题,我只是问在硬件中发生了什么。只是想详细说明一下:我从书中直接学到了所有这些。我还没有做过任何关于信号量的编程。但我对中断被禁用时SysTick的行为感到困惑。循环会重新启用它们,我认为SysTick会“等待”那行代码。但我不确定这是否正确。systick中断在翻转点断言时进行断言。核心是否允许它进入与启用有关。如果挂起,那么确定启用后,它将进入。作为旁注,作为特定于手臂的旋转锁,这种类型很糟糕。Thumb-2中的独占访问指令(LDREX、STREX、CLREX)旨在完全支持此类代码而不禁用中断,因此是首选。感谢您的回复!我之前试过你的建议,并用CPSID和CPSIE编写了一个我以前为SysTick编写的程序。当我在循环之前写入CPSID时,它没有进入处理器,因为外部LED没有闪烁。当我同时添加CPSID和CPSIE时,它会闪烁。我的另一个问题是,这是否会引起紧张?我想我可以自己检查一下,但我需要一个逻辑分析仪?