一步步写STM32 OS【一】 序言
一直想写个类似uCOS的OS,近段时间考研复习之余忙里偷闲,总算有点成果了。言归正传,我觉得OS最难的部分首先便是上下文切换的问题,他和MCU的架构有关,所以对于不同的MCU,这部分需要移植。一旦这个问题解决了,整个OS算是成功了一半了,当然,是对于简单的OS。
好了,要写一个OS,首先需要一个开发板和仿真器。我的开发板是STM32F4DISCOVERY,自带ST-LINK V2仿真器,板载MCU为STM32F407VGT6,支持FPU,32位ARM Cortex-M4F核,1024KB FLASH,192 KB RAM,总之很强大。对STM32其他系列,本OS几乎不需修改修改就可使用。开发环境为IAR for ARM 6.5,如果是MDK的话,也是大同小异,汇编部分需要修改。
研究了一下UCOS-II的Cortex-M4的Port部分,觉得很好,就直接拿来用了,修改的很少。首先我们来看一下这一部分几个比较重要的函数,打开os_cpu_a.asm文件,定位到下面的地方,注释我改成中文了。当OS初始化完毕后,执行OSStart,OSStart最后调用OSStartHighRdy函数,注意在此之前的线程模式和异常模式的堆栈都是MSP,在此之后线程模式的堆栈是PSP,异常模式的堆栈仍是MSP。
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; 设置PendSV的异常中断优先级
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0] MOVS R0, # ; 初始化PSP=0
MSR PSP, R0 LDR R0, =OS_CPU_ExceptStkBase ; 初始化异常堆栈MSP地址
LDR R1, [R0]
MSR MSP, R1 LDR R0, =OSRunning ; 置OSRunning = TRUE
MOVS R1, #
STRB R1, [R0] LDR R0, =NVIC_INT_CTRL ; 触发PendSV异常 (引起上下文切换)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0] CPSIE I ; 开启中断,于是进入PendSV异常 OSStartHang
B OSStartHang ; 正常情况下,不应运行到这
其中最核心的函数应该是OS_CPU_PendSVHandler了,它处理PendSV中断,完成上下文切换。
OS_CPU_PendSVHandler
CPSID I ; 关中断
MRS R0, PSP ; 获得PSP
CBZ R0, OS_CPU_PendSVHandler_nosave; PSP为0跳到OS_CPU_PendSVHandler_nosave,即不保存上文,直接进入下文。
; 问什么呢,因为首次调用,是没有上文的。
; 保存上文
SUBS R0, R0, #0x20 ; 因为寄存器是32位的,4字节对齐,自动压栈的寄存器有8个,所以偏移为8*0x04=0x20
STM R0, {R4-R11} ; 除去自动压栈的寄存器外,需手动将R4-R11压栈 LDR R1, =OSTCBCur ; 保存上文的SP指针 OSTCBCur->OSTCBStkPtr = SP;
LDR R1, [R1]
STR R0, [R1] OS_CPU_PendSVHandler_nosave ; 切换下文
PUSH {R14} ; LR压栈,下面要调用C函数
LDR R0, =OSTaskSwHook ; 调用OSTaskSwHook();
BLX R0
POP {R14} LDR R0, =OSPrioCur ; 置OSPrioCur = OSPrioHighRdy;
LDR R1, =OSPrioHighRdy
LDRB R2, [R1]
STRB R2, [R0] LDR R0, =OSTCBCur ; 置OSTCBCur = OSTCBHighRdy;
LDR R1, =OSTCBHighRdy
LDR R2, [R1]
STR R2, [R0] LDR R0, [R2] ; R0中的值为新任务的SP; SP = OSTCBHighRdy->OSTCBStkPtr;
LDM R0, {R4-R11} ; 手动弹出 R4-R11
ADDS R0, R0, #0x20 MSR PSP, R0 ; PSP = 新任务SP
ORR LR, LR, #0x04 ; 确保异常返回后使用PSP
CPSIE I
BX LR ; 退出异常,从PSP弹出xPSR,PC,LR,R0-R3,进入新任务运行
之后我们在此基础上构建自己的OS,首先完成两个任务互相调用,然后是加入SysTick的任务调度,最后加入信号量,邮箱等功能。
一步步写STM32 OS【一】 序言的更多相关文章
- 一步步写STM32 OS【四】OS基本框架
一.上篇回顾 上一篇文章中,我们完成了两个任务使用PendSV实现了互相切换的功能,下面我们接着其思路往下做.这次我们完成OS基本框架,即实现一个非抢占式(已经调度的进程执行完成,然后根据优先级调度等 ...
- 一步步写STM32 OS【三】PendSV与堆栈操作
一.什么是PendSV PendSV是可悬起异常,如果我们把它配置最低优先级,那么如果同时有多个异常被触发,它会在其他异常执行完毕后再执行,而且任何异常都可以中断它.更详细的内容在<Cortex ...
- 一步步写STM32 OS【二】环境搭建
一.安装IAR for ARM6.5 二.新建工程 1.选择处理器:STM32F407VG,暂不使用FPU 2.必要的路径配置和宏定义 3.使用SWO重定向IO输出 4.使用ST-LINK仿真器 5. ...
- VS code写stm32
第一次在知乎写博客,献丑了. VS code写stm32 今天实在觉得KEIL太丑,突然想到VS code也可以实现STM32代码的编写,遂决定写一个文章,把VScode变成一个STM32的IDE ...
- 〔写在OS边上〕定性note
转载:http://tieba.baidu.com/p/1273477757 0 neta 有的时候我们在读书或者看文档.——啊,原来这东西的框架就是这样而已,很直白么.有的时候我们在读代码.——于是 ...
- STM32学习笔记——序言
写AVR已经两年了.如果初中时候玩Arduino也算的话,就是6年. 两年以来,我用AVR单片机完成了两个大项目: AVR单片机教程,一时兴起写的,效果不好: MEDS,参赛用的课题,半完成,比赛都结 ...
- keil写STM32程序出现literal treated as "long long"
在Keil MDKARM中 unsigned int value2=0x80000000; unsigned int value4=2147483648; value2编译时不产生警告,而value4 ...
- x01.os.12: 在 windows 中写 OS
在 windows 中写操作系统,需要一系列的辅助工具.在此,要感谢川谷秀实!所有工具,都在 z_tools 文件夹中.有了大师的帮助,不妨也来尝试在 windows 中写一把 OS. 源代码及工具可 ...
- 异数OS-织梦师-异数OS虚拟容器交换机(七) 走进4Tbps网络应用时代,加速5G应用真正落地
. 异数OS-织梦师-异数OS虚拟容器交换机(七) 走进4Tbps网络应用时代,加速5G应用真正落地 本文来自异数OS社区 github: https://github.com/yds086/Here ...
随机推荐
- 改善EF代码的方法(下)
本节,我们将介绍一些改善EF代码的方法,包括编译查询.存储模型视图以及冲突处理等内容. > CompiledQuery 提供对查询的编译和缓存以供重新使用.当相同的查询需要执行很多遍的时候,那么 ...
- mysql大数据高并发处理
一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. ...
- Git 安装与使用(一)
一.简介 1.集中式版本控制系统(CVS):Svn * 版本库是集中存放在中央服务器中的,客户端需要先从中央服务器取得最新的版本,然后再干活,活干完后,再把自己的代码推送给中央服务器. ...
- Eat that Frog
Eat that Frog,中文翻译过来就是“吃掉那只青蛙”.不过这里并不是讨论怎么去吃青蛙,而是一种高效的方法. Eat that Frog是Brian Tracy写的一本书(推荐阅读).这是一个很 ...
- JQuery(三) Ajax相关
JQuery大大简化了Ajax通用操作,开发者只需要指定请求URL,回调函数即可. 三个主要方法: $().param(obj):将obj参数(对象或数组)转化成查询字符串. {name:" ...
- 通过LDF文件实现日志回滚将数据恢复(转)
该方法数据库恢复(www.db-recovery.com)思路 1. 创建数据TEST 2. 创建表TEMP_01 3. 在表TEMP_01中插入100条数据 4. 备份现有的数据库 5. 再次向表T ...
- centos 关闭触摸板,触摸板点击
yum install xorg-x11-apps xinput –list 由图可以看出俺的本本触摸板ID为14,于是可以通过以下命令开启与关闭它: 禁止touchpad:xinput set-in ...
- Win2008 R2 IIS7.5+PHP5(FastCGI)+MySQL5环境搭建教程
现在很多朋友想尝试win2008 r2来跑web服务器,跟win2003相比界面差别有点大,有些人可能不太习惯,不过以后是趋势啊,这里简单分享下,方便需要的朋友 准备篇 一.环境说明: 操作系统:Wi ...
- MVC 中 使用TagBuilder扩展HtmlHelper
TagBuilder就是标签建造器,我们就用它来建造属于我们自己标签生成函数. 无废话,直接上代码 例: using System.Web.Mvc; public static class HtmlE ...
- expdp ORA-39213
[oracle@BI2 dir_dp]$ impdp ruijie_kettle/ruijie_kettle schemas=ruijie_kettle directory=dir_dp dumpfi ...