Cortex-M系列芯片在移植uc/OS-II时需要注意的问题

Cortex-M系列芯片在移植uc/OS-II时需要注意的问题

写在前面:

本人也是第一次在STM32的芯片上进行操作系统的移植,并不能保证绝对的正确性。但是我会尽量列举出我在移植操作系统时所踩过的坑,帮助大家少走弯路。以后将持续更新 😃

前要

我在移植时所采用的的芯片是STM32F411RE,但其实在移植uc/OS-II时,所关注的重点是芯片的内核。也就是芯片的寄存器,异常处理,堆栈等部分。并不会涉及到芯片上的众多外设,而只关注于内核部分。STM32F1系列采用cortex-m3,STM32F4系列采用cortex-m4,这两种架构本身具有很多相似点,在移植uc/OS-II这件事上其实没有任何的差别,本文所讲的内容对两者都适用。

本文默认大家已经根据网上可以找到的资料,进行了操作系统的初步移植。即已经可以编译链接成功。但是我在根据网上找到的资料进行移植后,操作系统并不能直接跑起来。运行过程中总是会进入硬件中断HardFault_Handler中,下面我将列出问题的解决办法。

(为还没有初步移植的朋友提供一个链接:UCos-ii在STM32上的移植详解

PendSV的优先级设置

移植os后,在os_cpu_a.asm文件中,一定有四个数据的定义:

NVIC_INT_CTRL	EQU		0xE000ED04	;中断控制及状态寄存器ICSR的地址
NVIC_SYSPRI14	EQU		0xE000ED22	;系统异常优先级寄存器PRI 14,可以设置PendSV的优先级
NVIC_PENDSV_PRI	EQU		0xFF		;定义PendSV的可编程优先级为255最低优先级
NVIC_PENDSVSET	EQU		0x10000000	;1 以悬起 PendSV 中断,读取则返回 PendSV 的状态

这里提到了要设置PendSV的优先级为255,即最低的优先级。也就是向NVIC_SYSPRI14所指向的寄存器写0xFF。但是,其实并不能成功设置为255,下面我为大家展示Cortex内核的数据手册中的内容:
在这里插入图片描述
从图中可以看到,这个寄存器的地址是0xE000ED20,那么0xE000ED22所指向的就是寄存器的23~16这个byte。从图中可以得知 PRI_14[7:0] 都是用来表示PendSV优先级的,但是呢只有 PRI_14[7:4] 是可写的。这就意味着我们并不能将PendSV的优先级设置为255,最低只能设置成240,即0xF0。

PendSV和SysTick

这两者都是在移植os时非常重要的两个中断。PendSV用于上下文的切换,而SysTick用于控制系统时钟,为任务刷新延迟等待的时间。在移植os时,一定要保证PendSV的优先级为最低优先级,SysTick为仅次于前者的最低优先级,即将SysTick优先级设置为0xE0,PendSV优先级设置为0xF0,这样才能保证os的正常运行。这是我在实际操作中寻找到的规律,并不能解释其中的具体原因,所以只是一个经验主义结论,读者也可以自己做一些尝试。

前文提到了如何设置PendSV的优先级,下面我为大家提供SysTick优先级的设置方法:
在系统初始化时,一般都会调用一个用于初始换系统定时器的函数

void	SysTick_init(void)
{
	//	初始换,并且使能SysTick定时器
	if(SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC))
	{
		while(1);
	}
	//	初始化成功后退出
}

这里的SysTick_Config函数在core_cm4.h文件当中,它会自动地将SysTick的优先级设置成240,所以我们还需要将其优先级改为224。在SysTick_init这个初始化函数中再调用一个设置优先级的函数

void	SysTick_init(void)
{
	//	初始化函数自带了配置中断的步骤,所以不需要单独配置NVIC
	//	初始换,并且使能SysTick定时器
	if(SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC))
	{
		while(1);
	}
	//优先级换成0xE0,0xF0留给PendSV
	NVIC_SetPriority(SysTick_IRQn, 0xE);
}

最后

至此,我在移植uc/OS-II中所遇到的坑都已经讲完了,欢迎大家评论指正。以后遇到新的问题我也将继续更新这篇文章,谢谢大家!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值