初学者EFM32上移植uC/OSII

本文档详细记录了初学者在EFM32微控制器上移植uC/OSII操作系统的过程,包括前期准备、移植步骤、代码分析和修改。作者通过对比大学时的简单实验,强调了亲手实践的重要性。在移植过程中,主要涉及uc/OSII内核源码、移植文件的使用,以及中断级调度和系统启动任务的实现。在代码修改部分,重点讲述了启动代码和OS内核的挂接,确保中断函数名称的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

之前大学接触过uc/os,大学开了ARM这门课程,用的是周立功的教材,好像是大四开的,你懂的,实验只带手不带脑,复制–编译–下载–嘿,灯亮了–走人。
最近在接触EFM32系列MCU,就想弥补一下大学的遗憾。为时间4天的准备和移植工作终于完成,还是,嘿灯亮了。
硬件:EFM32G890F128
IDE : IAR

准备工作

两本书:Cortex-M3权威指南,uc/OSII操作系统原理(邵贝贝)。
因为内核之前已看过了,就琢磨了下uc,大学的时候接触过点点还有点印象,所以看起来不费什么劲,确实挺小的一个核。里面关于移植的过程也挺详细的。不过那里关于移植的是ARM7内核。大同小异。原理性的东西是一样的。
其余,关于移植部分,各大芯片厂商都已经很完善了,对于求知的同学,这是一个理解CPU,操作系统的好地方。

建立模板

  1. 官网下载源代码

    http://micrium.com/ ->downloads -> Application Notes ->
    这里写图片描述
    压缩包下载下来解压最主要的就是这几个文件夹了。
    这里写图片描述
    当然还有一个PDF文档,这个文档主要是教你怎样使用它们的官方工程模板。英文好的可以照着上面的步骤一步一步来,没什么说的,当然你要有耐心看英语。我试了下:确实规范,一目了然。
    这里写图片描述
    个人觉得学习的话还是自己建一个模板吧,这样有利于理解各个模块之间的关系。所以我就以自己的习惯加参考官方的自己操作了。
    其实我们自己移植的话就只要uc/OSII的内核源码和三个移植文件啦。最难的移植部分人家帮我们做好了,那就是那三个移植文件了,即os_cpu.h,os_cpu_a.asm, os_cpu.c当然我们还是要看懂的。

  2. 接下来就是建工程,这是我自己的工程:
    这里写图片描述

代码分析

这里的代码分析就是与处理器相关的代码了,最接近处理器的代码:汇编。
主要干了两个个事情:

  1. 任务级和中断级调度,这两个函数的内容是一样的,真正的调度则放到了PENDSVHandler。
  2. 系统开始启动时,启动最高优先级任务。
  3. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值