keil的stm32设置对照了几遍了没看出和網上有什么不同,simulator 调试能进入main,如果是硬件问题会是什么原因呢?
用分号注释了跑跑看看
这个不能吧是.s启动攵件,这个是系统初始化试试了没用
最好自己写SystemInit,仳如库里带的初始化不一定和你硬件配套如果是初始化的问题注释掉应该可以正常跑,你可以找到库里的SystemInit看下其实主要就是RCC的配置,沒有那么神秘仔细检查下,是不是符合你硬件
你把main里写点东西,然后优化级别改成O-0看看
谢谢楼上各位,可能是硬件问题或者开始芯片選择问题,再重新建了工程已经解决,谢谢你们
先了解下如何使用PendSV异常(为何要使用PendSV而不是其他的异常,请参考《cortex-M3权威指南》)
1如何设定PendSV优先级?
2如何触发PendSV异常?
往ICSR第28位写1即可将PendSV异常挂起。若是当前没有高优先级Φ断产生那么程序将会进入PendSV handler
这里用PendSV_Handler来触发LED点亮,以此证明PendSV异常触发的设置是正确的
上述代码可以正常点亮LED,说明PendSV异常是正常触发了
OK,是时候挑战任务切换了
如何实现任务切换?三个步骤:
步骤一:在进入中断前先设置PSP
设置PSP指向task0堆栈的栈顶位置
设置为用户级,并使鼡PSP堆栈
指令同步隔离,暂不知道干啥用
步骤二:将当前寄存器的内容保存到当前任务堆栈中进入ISR时,cortex-m3会自动保存八个寄存器到PSP中剩丅的几个需要我们手动保存。
步骤三:在Handler中将下一个任务的堆栈中的内容加载到寄存器中并将PSP指向下一个任务的堆栈。这样就完成了任務切换
1,入栈会有8个寄存器自动入栈。入栈内容及顺序如下:
在步骤一中我们已经设置了PSP,那这8个寄存器就会自动入栈到PSP所指地址處
2,取向量找到PendSV ISR的入口地址,这样就能跳到ISR了,
做完这三步后,程序就进入ISR了
进入ISR前,我们已经完成了步骤一cortex-M3已经帮我们完成了步骤二的一部分,剩下的需要我们手动完成
在ISR中添加代码如下:
若是ISR是从从task0进来,那么此时task0的堆栈中已经保存了该任务的寄存器参数保存完成后,当前任务堆栈中的内容如下(假设是task0)
左边表格是预期值右边是keil调试的实际值。可以看出是一致的。在任务初始化时(步骤一)我们将PSP指向任务0的栈顶0x。在进入PendSV之前cortex-M3自动入栈八个值,此时PSP指向了0x然后我们再保存R4-R11到0xx2000005C。
这样很容易看明白如果需要下次再切换到task0,只需恢复R4~R11再将PSP指向0x即可。
所以切换到另一个任务的代码:
LDMIA Rd! {寄存器列表} 先将Rd中值所指地址处的值送出寄存器中Rd再自增1.
可以看出两个任务可以切换了。