基于stm32的多任务系统设计日记12.20-12.24

本文记录了基于STM32F103ZET6芯片设计多任务系统的过程,重点在于实现任务的上下文切换。通过利用Cortex-M3的硬件特性,如SysTick定时器、双堆栈结构和CONTROL寄存器,来管理和切换任务。详细分析了中断处理、堆栈切换、进程状态管理等关键环节,为构建简单操作系统打下基础。
摘要由CSDN通过智能技术生成

受够了一个单片机傻乎乎的一路执行着代码的时代,决定自己实现一个多任务系统,虽然有现成开源的,但是借这个机会用自己的想法去设计系统毕竟是个不错的事情。

一个多任务系统的重点是实现任务的上下文切换,在多个进程中间来回切换。抱着这个想法先初步设计任务切换的实现过程。

这次的处理器是stm32f103zet6,内存64KB,Flash512KB,相对于运行一个简单的多任务系统绰绰有余,况且cortex-M3的核心在设计时候就考虑到了操作系统的运行,硬件上满足操作系统的要求。

首先是关于这个芯片,仔细看一看coretex-M3权威指南和各种相关的技术手册后,大致能得到一些在多任务系统上用的着的东西:

1.      Cortex-M3把SysTick定时器中断作为系统异常。

2.      Cortex-M3是双堆栈结构,两个SP分别是MSP和PSP。通过CONTROL寄存器进行切换。具体的见后边的分析。

3.      Cortex-M3的中断处理具体流程。见后边分析。

 

基础知识:

首先是系统如果不采取措施,一个进程运行开始后会霸占CPU不放手,这样任务切换肯定没法实现,所以必须有个强制的手段让系统内核“夺回”CPU,而这个措施就是系统心跳SysTick定时器,设置好这个定时器之后,它会不间断的按照设定的时间产生系统异常。而我们在系统异常中断中进行任务的各种处理就可以了。

实现任务的切换最重要的就是把任务工作的现场原封不动的备份好,再恢复回去,按照ARM过程调用规范(ATPCS规范,见官方文献),编译器如果用到了r4-r11中的寄存器,它会在使用前进行压栈,在函数推出之前进行出栈。根据《Cortex-M3权威指南》,CPU中有r0-r15寄存器,xPSR寄存器,以及控制寄存器CONTROL和中断屏蔽寄存器,我们的现场只需要关心r0-r15以及xPSR就好了。根据权威指南(权威指南几乎提到了需要的所有细节)的中断的具体行为一章,发生中断时,硬件会自动进行压栈,压入的寄存器和顺序如下表:



可以看出r4-r11是没有被硬件进行备份的所以需要我们手动备份(话说真的很麻烦,不过也是为了中断响应效率着想)。其次是,cortex-M3是双堆栈的,那么到底和单堆栈有什么区别?其实我们访问r13也叫sp,得到的是当前的堆栈指针,进行push和pop也是利用当前的堆栈,那当前的堆栈到底是谁呢?现在已经知道这个内核有MSP和PSP两个堆栈指针,通常我们写的裸机代码都是只用了MSP,因为一个堆栈指针就够了,然而想想在操作系统里边会发生什么?不同的进程用着同一个堆栈,什么时候被中断的都不知道,那肯定互相破坏堆栈中各自的数据,其次,内核的堆栈不能让人破坏,否则系统就崩了。现在知道了双堆栈的用处就是分别拿给系统和应用程序用的了。那么怎么控制双堆栈呢?就需要用CONTROL寄存器了,读一读看一看参考文献,这个寄存器就用了两个位(话说挺豪的),0位设置当前的模式,1位设置当前是否为双堆栈。如果把[1]位设定为1的话,那么就成了双堆栈,这个是会立刻生效的,马上你的指针就会变成PSP指针,这个寄存器有个特点,你不是特权级就不能写设置,当然也就不能更改为双堆栈咯,这一点会在之后提到怎么通过SVC软件中断来实现特权级切换,也不用担心,因为刚刚进入main函数的时候,只要之前的库代码中没有更改特权等级,那就是特权级。那么PSP指针和MSP指针怎么设置呢?前边我们已经通过更改control寄存器实现了堆栈的切换,那么总要切换个我们可以控制的地方吧(当然也就是我们想让数据存在哪里)。PSP和MSP这两个寄存器无论什么时候都可以用mrs指令来读取,用msr指令来写入,就像这样:

MSRR0,PSP

MRS MSP,R0

这样我们只需要实现给他们设置好值,然后切换为双堆栈就可以了。

现在我们知道怎么配置双堆栈了,还有个问题肯定是,什么时候用到MSP呢?那就是当发生中断的时候,系统肯定会切换为MSP并且你不能改变CONTROL来在中断返回之前切换堆栈。那刚刚提到的硬件自动按照表里的顺序备份,到底备份到了哪个堆栈?这就看发生中断时候的堆栈是哪个了,通常我们中断是发生在应用程序期间的,所以一般是备份到PSP,那特殊呢?还是以后慢慢想吧。

有了上边的东西我们就要总结一下系统干了什么:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值