前言
之前大学接触过uc/os,大学开了ARM这门课程,用的是周立功的教材,好像是大四开的,你懂的,实验只带手不带脑,复制–编译–下载–嘿,灯亮了–走人。
最近在接触EFM32系列MCU,就想弥补一下大学的遗憾。为时间4天的准备和移植工作终于完成,还是,嘿灯亮了。
硬件:EFM32G890F128
IDE : IAR
准备工作
两本书:Cortex-M3权威指南,uc/OSII操作系统原理(邵贝贝)。
因为内核之前已看过了,就琢磨了下uc,大学的时候接触过点点还有点印象,所以看起来不费什么劲,确实挺小的一个核。里面关于移植的过程也挺详细的。不过那里关于移植的是ARM7内核。大同小异。原理性的东西是一样的。
其余,关于移植部分,各大芯片厂商都已经很完善了,对于求知的同学,这是一个理解CPU,操作系统的好地方。
建立模板
官网下载源代码
http://micrium.com/ ->downloads -> Application Notes ->
压缩包下载下来解压最主要的就是这几个文件夹了。
当然还有一个PDF文档,这个文档主要是教你怎样使用它们的官方工程模板。英文好的可以照着上面的步骤一步一步来,没什么说的,当然你要有耐心看英语。我试了下:确实规范,一目了然。
个人觉得学习的话还是自己建一个模板吧,这样有利于理解各个模块之间的关系。所以我就以自己的习惯加参考官方的自己操作了。
其实我们自己移植的话就只要uc/OSII的内核源码和三个移植文件啦。最难的移植部分人家帮我们做好了,那就是那三个移植文件了,即os_cpu.h,os_cpu_a.asm, os_cpu.c当然我们还是要看懂的。接下来就是建工程,这是我自己的工程:
代码分析
这里的代码分析就是与处理器相关的代码了,最接近处理器的代码:汇编。
主要干了两个个事情:
- 任务级和中断级调度,这两个函数的内容是一样的,真正的调度则放到了PENDSVHandler。
- 系统开始启动时,启动最高优先级任务。
- PENDVHandler保存上下文切换环境。
下面分析整个OS_CPU_A.ASM文件
EXTERN OSRunning ; External references,外部标号
EXTERN OSPrioCur
EXTERN OSPrioHighRdy
EXTERN OSTCBCur
EXTERN OSTCBHighRdy
EXTERN OSIntExit
EXTERN OSTaskSwHook
EXTERN OS_CPU_ExceptStkBase
PUBLIC OS_CPU_SR_Save ; Functions declared in this file,全局函数,可被其他模块引用
PUBLIC OS_CPU_SR_Restore
PUBLIC OSStartHighRdy
PUBLIC OSCtxSw
PUBLIC OSIntCtxSw
PUBLIC PendSV_Handler
NVIC_INT_CTRL EQU 0xE000ED04 ; Interrupt control state register. 中断控制寄存器
NVIC_SYSPRI14 EQU 0xE000ED22 ; System priority register (priority 14).优先级寄存器
NVIC_PENDSV_PRI EQU 0xFF ; PendSV priority value (lowest). PENDSV优先级(最低)
NVIC_PENDSVSET EQU 0x10000000 ; Value to trigger PendSV exception. 触发PENDSV的值
;**********************************************************************************************
; 代码部分
;**********************************************************************************************
RSEG CODE:CODE:NOROOT(2)
THUMB
;RSEG 是段选择指令。RSEG CODE:选择段 code。第二个 CODE 表示代码段的意思,只读。
;NOROOT 表示:如果这段中的代码没调用,则允许连接器丢弃这段.(2)表示:4 字节对齐。假如是(n),则表示 2^n 对
;齐,更多关于IAR编译指令参考IAR编译手册。
;THUMB则为代码为THUMB指令,M3为THUMB指令集。
OS_CPU_SR_Save
MRS R0, PRIMASK ; 保存PRIMASK值至R0,OS_CPU_SR_Save返回时,R0中值送入
; cp