STM32中 uCOS II怎么实现选择PSP作为堆栈指针

2019-07-20 21:53发布

STM32有一个CONTROL寄存器 可以用来选择在非中断模式下使用的堆栈指针是PSP还是MSP 这部分的代码应该只能使用汇编实现的,但是我看了uCOSII唯一的一个汇编文件 里面根本没有对CONTROL寄存器进行对应的操作 请问大家uCOSII 怎么实现堆栈指针切换的?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
zmingwang
1楼-- · 2019-07-21 00:59
本帖最后由 zmingwang 于 2016-6-2 00:16 编辑

这个问题有点复杂,我没有看过ucos的源码,所以只能给你提供一些思路.
在用户模式下,是不能直接访问cortex内核寄存器的,所以ucos应该是没有使用用户模式,否则你在ucos线程中初始化NVIC就一定会进HardFault_Handler.
如果你要使用用户模式,那就应该移植以下几个地方:
1.跟踪ucos的线程创建函数,一直跟到最低层的汇编代码,找到设置栈顶的那条指令,一般是 "MSR  MSP, R0"这样的,将之改为"MSR  PSP, R0","MOV R0, #0x03","MSR CONTROL, R0".
2.同样,用于上下文切换的汇编函数,也要将"MSR  MSP, R0"改为"MSR  PSP, R0",此处就可以不用设置CONTROL了.
3.因为应用程序完全有可能在线程中创建线程,所以要将1中的汇编函数改为SVC调用.
4.因为线程会主动放弃CPU,比如调用osDelay(),所以要将ucos实现上下文切换的汇编函数改为SVC调用
5.因为系统的时间片中断(一般是SysTick_Handler)里会进行线程调度,所以还要在PendSV中实现上下文切换,在SysTick_Handler中触发PendSV.
以上,我能想到的就这么多,你试试吧





正点原子
2楼-- · 2019-07-21 03:16
帮顶
灼灼其华
3楼-- · 2019-07-21 04:58
zmingwang 发表于 2016-6-2 00:09
这个问题有点复杂,我没有看过ucos的源码,所以只能给你提供一些思路.
在用户模式下,是不能直接访问cortex内 ...

谢谢您的回答

一周热门 更多>