C语言 ARM皮质如何处理PendSV Handler



我正在创建一个RTOS内核,需要使用PendSV处理程序进行上下文切换。我触发PendSV处理程序执行:0xE000ED04 = (0x1 <<28);。这会将PendSVset寄存器设置为1,因此理论上,处理程序应该触发。我在触发中断之前禁用中断,在触发中断之后启用中断。启用后应该触发PendSV。优先级为最低的0xFF,系统棒处理程序优先级为0x00。我不确定发生了什么,为什么pendsv处理程序没有运行。我正在使用TI-MSP432控制器,我想也许这是控制器处理中断的方式?

在vectpending中设置,vectpending为001110,对于pendsv为14。

如果有人能帮忙,我将不胜感激。

我假设您在系统棒计时器处理程序中设置PENDSVSET位(从您在评论中给出的信息)。由于您将PendSV的优先级设置为低于系统棒的优先级,因此PendSV将挂起,直到系统棒中断返回。PendSV不能中断系统棒,因为它具有较低的优先级。当从系统中断返回时,PendSV将通过尾链中断保持。

所以不,PendSV中断将不会立即产生当你设置PENDSVSET位内的系统计时器处理程序如你所期望的。它只会在从系统棒中断返回时中断。

您是否尝试过这样简单的东西(一次性代码实验对于裸机开发至关重要,尝试不考虑项目的其余部分和所有过度复杂的情况)

.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 pendsv_handler
.word hang
.thumb_func
reset:
bl notmain
b hang

.thumb_func
hang:   b .
.align
...

.thumb_func
pendsv_handler:
mov r4,#1
bx lr

.thumb_func
.globl pendsv_test
pendsv_test:
push {r4,lr}
mov r4,#0
str r1,[r0]
pendsv_loop:
cmp r4,#0
bne pendsv_loop
mov r0,r4
pop {r4,pc}

的电话
#define ICSR 0xE000ED04
hexstring(0x12345678);
hexstring(pendsv_test(ICSR,1<<28));
hexstring(0x11111111);

,在我的例子中有一些输出:

12345678 
00000001 
11111111 

然后可以转到这个:

.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 pendsv_handler
.word hang

// ************** EXCEPTION HANDLER ***************
void pendsv_handler ( void )
{
hexstring(GET32(ICSR));
}
// ************** EXCEPTION HANDLER ***************
int notmain ( void )
{
clock_init();
uart2_init();
hexstring(0x12345678);
PUT32(ICSR,1<<28);
hexstring(0x11111111);
return(0);
}

12345678 
0000080E 
11111111 

告诉我,当它进入处理程序时,PendSV被清除。

就优先级而言,文档说pendsv和svc是相等的,所以

stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word svc_handler
.word hang
.word hang
.word pendsv_handler
.word hang

// ************** EXCEPTION HANDLER ***************
void pendsv_handler ( void )
{
hexstring(0x22222222);
hexstring(GET32(ICSR));
hexstring(0x22222222);
}
// ************** EXCEPTION HANDLER ***************
// ************** EXCEPTION HANDLER ***************
void svc_handler ( void )
{
unsigned int ra;

hexstring(GET32(ICSR));
PUT32(ICSR,1<<28);
for(ra=0;ra<20;ra++)
{
hexstring(GET32(ICSR));
}
}
// ************** EXCEPTION HANDLER ***************
int notmain ( void )
{
clock_init();
uart2_init();
hexstring(0x12345678);
SVC();
hexstring(0x11111111);
return(0);
}

注意:

.thumb_func
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.thumb_func
.globl GET32
GET32:
ldr r0,[r0]
bx lr

则得到

12345678 
0000080B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
1000E80B 
22222222 
0000080E 
22222222 
11111111

pendsv触发的永恒时间,但由于svc调用在文档中是相等的,所以它不能触发,直到svc调用返回。您也可以对中断执行此操作,但是异常应该高于中断。查看文档

没有理由说你的经历和我的不一样。如果pendsv没有发生,那就分而治之。把问题分成两半。拿起当前的代码,开始删除那些无用的东西。这样做一会儿。从几乎什么都没有开始,然后开始添加东西,朝着中间的方向工作,你会发现似乎是什么导致了它,要明白即使你找到了,那也可能不是它。这是IT的内部代码,您可能已经创建了另一种情况。

阅读和一次性代码实验占用了裸机超过99%的时间。编写最后的程序只占你时间的很小一部分。

你是否做了这些事情来看看中断处理程序或你正在做的其他事情是如何影响pendsv成功的?设置完挂件后,ICSR注册表显示的是什么?相对于pendsv的时钟周期,系统棒或其他同等级别处理程序中还有多少时间,您是否在系统级别设计中确保处理程序都有空闲的时钟。

如果你想在系统棒处理程序中执行线程交换,那么要么直接执行,要么使用svc,而不是pendsv。

相关内容

  • 没有找到相关文章

最新更新