我正在学习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寄存器COUNT位都会被提升 . 这是等效的RIS位吗?参考手册没有明确说明 . 谢谢!
编辑:我查阅了参考手册 . PRIMASK取值为1以禁用具有可配置优先级的所有异常,因此我认为之前的代码是错误的 . 它应该是1 .
MOVS r0, #1
MSR PRIMASK, r0
编辑:修正了拼写错误 .
1 回答
arm docs state
就试一试吧...
led开启了
领导保持不变
带领
领导
cpsid / cpsie是小的单指令
我会选择cpsid / cpsie .