_C_OS_在Cortex_M3处理器上的移植
15.6、 SysTick系统滴答实验

SysTick系统滴答实验SysTick实际就是系统滴答定时器,主要是为了操作系统提供一个专用的硬件上的定时中断。
神舟系列的本例程通过SysTick定时器,产生的中断进行点灯控制。
我们按照以下的几个部分对SysTick实验进行学习。
z意义与作用SysTick定时器:系统滴答定时器是一个非常基本的倒计时定时器,用于在每隔一定的时间产生一个中断,即使是系统在睡眠模式下也能工作。
它使得OS 在各CM3器件之间的移植中不必修改系统定时器的代码,移植工作一下子容易多了。
如下图两个任务间通过SysTick 轮转调度的简单模式所示。
图表 1 两个任务间通过SysTick 轮转调度的简单模式SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。
例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。
因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
Cortex‐M3处理器内部包含了一个简单的定时器。
因为所有的CM3芯片都带有这个定时器,软件在不同CM3器件间的移植工作得以化简。
该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。
不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。
SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。
它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。
第3讲 Cortex-M3-0基础

Cortex-M3/M0内核组成与调试
l
l l
l
NVIC ,即Nested Vectored Interrupt Controller,嵌套向量 中断控制器,是Cortex-M3/M0中内建的中断控制器。NVIC 紧密地耦合到微控制器内核,支持矢量中断和嵌套中断。 此外,它还支持更多中断源:Cortex-M0/M1支持最多32个 IRQ,Cortex-M3支持最多240个IRQ。 Cortex-M0/M1支持4个可编程优先级,而Cortex-M3则支持8 至256个级别,具体数目视实现情况而定(通常为8或16个级 别)。 SysTick Timer ,即SysTick定时器是NVIC内部用于提供时基 的倒计时定时器,用于在每隔一定的时间产生一个中断,即 使是系统在睡眠模式下也能工作。它使得操作系统在各 Cortex-M3/M0器件之间的移植中不必修改系统定时器的代 码,移植工作一下子容易多了。
相 同 点
总线宽度 调试系统
内部的数据总线、存储器接口地址和寄存器都是32位宽的。数据存储器和程序存储器 等共享(统一编址)并划分32位(232=4G)的寻址空间。 基于ARM最新的CoreSight架构,CPU提供称为“调试访问接口(DAP)”的总线接口,各调 试组件都可以由DAP总线接口来访问和控制。
比较项目 整体架构 MPU 端模式 不 同 点 Cortex-M3 3 级流水线哈佛结构 Cortex-M3提供一个可选的存储器保护单元 (MPU),而且在需要的情况下也可以使用外 无 部的cache。 既支持小端模式(默认),也支持大端模式 小端模式 对齐访问 Cortex-M0 3 级流水线冯·诺伊曼结构,同ARM7
嵌入式作业题答案

嵌入式系统原理及应用作业题答案第1章嵌入式系统概述1. 什么是嵌入式系统?嵌入式系统的组成?答:嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
组成:嵌入式处理器、外围设备、操作系统、应用软件。
2. 典型的嵌入式处理器有哪些?3. 答:微处理器、微控制器、DSP处理器、片上系统SOC。
4. 典型的RTOS操作系统有哪些?5. 答:嵌入式LinUX、卩CLinUX、WindoWS Embedded CE、WindoWS Embedded ComPaCt 7 > μC/OS-II > μC/OS-III、VXWorks、eCos 等。
6. 列举身边的嵌入式应用产品?7. 嵌入式系统的设计可以分成四个阶段:需求分析、架构设计和概要设计、详细设计和开发、测试反馈。
第2章COrteX-M体系结构8. ARM COrteX系统的处理器分为: A 、__________ R ____ 、____ M ____ 。
9. ARM COrteX-M3为32位微控制器,请问32位指的是CPlJ字长。
10. 3、COrteX-M3处理器能够以小端格式或大端格式访问存储器中的数据字,而访问代码时始使用小端格式______11. ARM COrteX-M3体系结构采用哈佛总线结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行进行。
12. CM3寄存器分为通用寄存器,包括R0~R15和特殊功能寄存器,包括程序状态寄存器、异常屏蔽寄存器、控制寄存器。
13. 寄存器R13是堆栈指针寄存器。
14. 寄存器R14是程序连接寄存器。
15. 寄存器R15是程序PG16. CM3的堆栈指针分为__MSP__ _=PSP r O存储器堆栈堆栈分为:向上生长(即向高地址方向生长)的递增堆栈;向下生长(即向低地址方向生长),称为递减堆栈。
基于stm32的无线通信系统设计课程设计

课程设计说明书题目:基于STM32的无线通信系统设计课程: ARM课程设计院(部):计算机科学与技术学院专业:计算机科学与技术专业班级:学生姓名:学号:指导教师:完成日期:目录课程设计说明书 (I)课程设计任务书 (2)1.课程设计题目 (3)2.课程设计目的 (3)3.课程设计内容 (3)3.1硬件资源 (3)3.2软件资源 (8)3.3调试环境准备与使用 (11)3.4系统设计步骤 (12)3.4.1需求分析 (12)3.4.2概要设计 (12)3.4.3详细设计 (16)3.4.4系统实现及调试 (20)3.4.5功能测试 (40)3.4.6系统评价(结果分析) (41)3.5.结论(体会) (42)3.6.参考文献 (42)课程设计指导教师评语 (43)山东建筑大学计算机科学与技术学院课程设计任务书设计题目基于STM32的无线通信系统设计指导教师班级学号已知技术参数和设计要求技术参数:基于Cortex-M3内核的奋斗STM32开发板,无线射频收发器nRF24L01P工作于2.4GHz频段,STM32和nRF24L01P之间采用SPI 接口方式,嵌入式操作系统平台采用uC/OS-II。
设计要求:用STM32开发板和nRF24L01扩展板设计一个基于uC/OS-II的无线通信系统,能够实现两个无线节点间的数据收发。
设计内容与步骤设计内容:1.编写STM32和nRF24L01P的初始化程序。
2.将uC/OS-II移植至 STM32。
3.设计简单的无线通信协议,编写无线通信任务和射频收发中断服务子程序。
设计步骤:1.uC/OS-II任务划分及概要设计,ISR的功能设计。
2.编写 STM32和nRF24L01P的初始化程序,调试STM32的片内定时器模块,编写基于nRF24L01P模块的数据收发ISR。
3.编写与移植相关的几个函数,将uC/OS-II移植至 STM32。
4.拟定通信协议,编写无线通信任务。
uCOS-Ⅲ在Cortex-M4平台上的移植和实现

} { 奇 器 "舟 存 嚣 { } 奇 仃 器 "奇 ; j : }
I
I 蛆 奇行器
{ j 寄 器
} i 寄 嚣
l
匝 亘 至 翻
I l f I 托卅 } l ( M S P )逊 堆 栈指 t l ( B S P I
髓控懈 仃器f t . R )
,
管理 ,“有加强 了理论 和实践棚结 合机房队伍 的梯 队建设 , 才能真正发挥} J { 高校机 的优势。 其 次,机房管理 人 员应善于学习、善 j 总结经
验 ,实 验 中心 通 过 组 织 学 > J 或 者 培 训 的 疗式 ,
探讨 . 教育教学论坛 , 2 0 1 7 ( 0 4 ) : 1 2 - 1 3 .
全为 3 2位 , 所 仃 指 令 均 u 对 其 进 行 访 ;
R 0 ~ R 8为 高 寄 仃 器 , : K全为 3 2位 , { 彳 丁
< <上 接 1 5 2页
一 一 一 一 一 一 一 一 窝
迎应参 ‘ j 到 实验 课 教 学 { I I这 样 容 易发 问题 许 及时 解 决 。 高校 计 算 机房 管 应 改 变 观 念 ,
抢 占 式 的 实 时 内 核 , 它 管理 的任 务 个 数 不 受 限 制 。它作为 Mi c r i u m 推 的第 三代 操 作 系 统 内 核 ,提 供 脱 代 实时 内 核所 期 望 的 大 部 分功 能 包 括 资 源 符理 、 步 、 内部 任 务通 信 锋 功 能 。 u C OS — I I I 也提 供 J , , 艮多特 件 是 在 其 他 实 时 内
吸 引 更 多高学 历 、 高技 术 的 人 参 到 实 验 室
或 软件 的 安装 , 联 想 络 l 司传 对 网 络 要 求 较 高 ,
第三讲_Cortex-M3基础

R15:程序计数寄存器(PC)
指向当前的程序地址。 如果修改它的值,就能改变程序的执行。
寄存器
特殊功能寄存器
Cortex‐M3 还在内核上搭载了若干特殊功能寄存器,包 括: 程序状态字寄存器组PSRs;
中断屏蔽寄存器组PRIMASK, FAULTMASK, BASEPRI; 控制寄存器CONTROL。
位带操作的概念其实30年前就有了,8051 单片机开创的 先河。这里的位带操作是8051 位寻址区的威力大幅加强 版。 CM3 使用如下术语来表示位带存储的相关地址 位带区: 支持位带操作的地址区; 位带别名: 对别名地址的访问最终作用到带区的访问 上(注意:这中途有一个作地址映射过程)。
可嵌套中断支持
可嵌套中断支持的作用范围很广,覆盖了所有的外部中断 和绝大多数系统异常。 外在表现是:这些异常都可以被赋予不同的优先级,当前 优先级被存储在xPSR 的专用字段中。当一个异常发生时, 硬件会自动比较该异常的优先级是否比当前的异常优先级 更高。 如果发现来了更高优先级的异常,处理器就会中断当前的 中断服务程序,而服务新来的异常,这个过程立即抢占。
系统总线用于访问内存和外设,覆盖的区域包括SRAM, 片上外设,片外RAM,片外外设等。 CM3 处理器的总线接口是基于AHB和APB 协议的,它们 的规格在AMBA 规格书中给出。
I-Code 总线
当CPU响应中断、保护断点之后,就要进行中断源的识别, 即寻找中断源,找到相应的中断服务程序入口。 识别中断源有三种方法:查询法、向量法和强置程序计数 器法(已被淘汰)。
查询法
通过程序来查询是哪一个中断源提出的中断请求。 过程:在CPU响应中断之后,对所有的中断,都进入到这个 查询流程。先看中断源1是否提出请求,若是,转去执行中断 源1的中断服务程序;否则再看中断源2是否提出请求,若是, 转去执行中断源2的中断服务程序。否则继续查看后面的中断 源…。 查询的顺序决定了中断的优先级。当发现一个中断源提出中 断请求后,就转去执行相应的服务程序,而不再继续向下查 找,不管它们是否也提出了请求。中断源1的级别最高,中断 源2的级别次之,中断源n的级别最低。
STM32移植uCOS-II
32
2. 安装 MDK,解压外设库和 uCOS-II 源码 3. 创建工程目录结构,如下
4. 复制外设库 � STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下
128
#endif � 打开 os_cfg.h,将 OS_APP_HOOKS_EN 设置为 0 � 打开 main.c,全选删除,并将以下内容复制进去,具体板级代码需要适
当修改
#include "ucos_ii.h" #include "stm32f10x.h"
#define LED_0 0 #define LED_1 1 #define LED_2 2 #define LED_3 3
case LED_3: GPIO_SetBits(GPIOD, GPIO_Pin_7); break;
default: break;
}
}
void led_off(uint32_t n) {
switch (n) {
case LED_0: GPIO_ResetBits(GPIOD, GPIO_Pin_2); break;
所有文件到新建的 Ports 目录下 � Micrium\Software\uCOS-II\Source 下的所有文件到新建的 Source 下 � Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK\OS-Probe 下
的 app_cfg.h 和 os_cfg.h 到工程目录的 User 中 6. 打开 Keil,创建新工程,选择器件,注意弹出来的是否添加启动文件的询问
【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)
5.1 移植前准备工作说明
1. RTX 系统软件开发平台仅支持 MDK,建议使用 MDK4.74,因为后面的例子都是以 MDK4.74 为平台。 2. 找一个简单的工程,最好是跑马灯之类的,越简单越好,我们就在这个简单的工程上面移植即可。 3. 大家使用的简单工程里面不能有 SysTick,PendSV 和 SVC 三个系统中断的使用,因为 RTX 系统
本章教程为大家将介绍 RTX 操作系统库方式移植,库方式的移植超级简单,应该是所有 RTOS 里面 最简单的了,仅需简单的两步就可以完成。
本章教程含 Cortex-M3 内核的 STM32F103 的移植和 Cortex-M4 内核的 STM32F407 移植。 5.1 移植前准备工作说明 5.2 STM32F103 移植 RTX 系统 5.3 STM32F407 移植 RTX 系统 5.4 总结
AppTaskCreate();
while(1) {
bsp_LedToggle(1); bsp_LedToggle(4); os_dly_wait(500); } }
中断服务程序中调用以isr开头的函数时会将请求类型存到此缓冲523rtx操作系统应用实例通过上面对rtx操作系统的配置讲解这里将其修改为如下图53所示的配置
武汉安富莱电子有限公司
安富莱 STM32-V4 开发板 RTX 教程
第5章 RTX 操作系统库方式移植(超级简单)
/* 任务句柄 */ OS_TID HandleTaskLED = NULL;
/* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准 c 程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) {
Cortex_M3指令集
STR.W R0, [R1], #-12 ;
该指令是把 R0 的值存储到地址R1 处的。在存储完毕后, R1←R1+(‐12).注意,[R1]后面是没有“!”的。可见,在后索引中,基 址寄存器是无条件被更新的——相当于有一个“隐藏”的“!”
PUSH/POP 作为堆栈专用操作,也属于数据传送指令类。
CoProcessor)标志置位)。
改变处理器状态指令(CPS)的一些用法也不再支持。这是因为PSRs 的 定义已经变了,以前在v6 中定义的某些位在CM3 中不存在。
有些提示(hint)指令的功能不支持,它们在CM3 中按“NOP‖指令对待
三、近距离地检视指令
从现在起,我们将介绍一些在ARM 汇编代码中很通用的语法。有些指令 可以带有多种参数,比如预移位操作,但本章并不会讲得面面惧到。
请注意:不同汇编器的指示字和语法都可以不同。上述示例代码都是按 ARM 汇编器的语法格式写的。如果使用其它汇编器,最好看一看它附带的示例 代码。
2.汇编语言:后缀的使用
在 ARM 处理器中,指令可以带有后缀,如表4.1 所示。
在 Cortex‐M3 中,对条件后缀的使用有限制,只有转移指令(B 指令)
CM3 除了支持“预索引”,还支持“后索引”(Post‐indexing)。后
索引也要使用一个立即数offset,但与预索引不同的是,后索引是忠实使 用基址寄存器Rd 的值作为数据传送的地址的。待到数据传送后,再执行
Rd ������
Rd+offset(offset 可以是负数——译注)。如:
后索引
二、指令集
在讲指令之前,先简单地介绍一下Cortex‐M3 中支持的算术与逻辑标
志。本书在后面还会展开论述。它们是:
基于μCOS的智能台区监控终端设计
基于μCOS的智能台区监控终端设计作者:任彬方斌斌来源:《中国新技术新产品》2013年第21期摘要:本文概述了μC/OS的智能台区监控终端的工作原理、硬件设计、软件设计。
关键词:智能台区;监控;管理中图分类号:TN967 文献标识码:A1 原理设计智能台区监是控利用电力电子技术、自动控制技术、数字信号处理技术,将配变监测、计量、集中抄表、电能质量监视、无功优化控制补偿、电能质量调节、谐波治理等功、分布式电源管理等功能有机地融合在一起,形成资源共享、数据共享,实现电能质量实时监测,综合治理,降低损耗等功能应用的一体化平台设备。
终端基础功能包括:模拟采样:通过互感器采样母线电压、电流、温度等实时模拟量;开关量采集:采集开关状态(分、合、储能)和设备运行状态等状态量;无功补偿控制:输出控制电压,投/切复合开关来控制无功补偿电容器;控制输出:通过电动操作机构的辅助触点实现开关分/合闸操作;RS-485:使用RS-485通讯实现抄读电表和台区内其他设备的管理;远程通讯:提供以太网和无线公网实现远程通信。
台区终端通过分析实时采集的模拟量和开关量,监测电能质量,负荷状态,根据现场的配置分析现场运行状况,智能管理无功补偿和开关投切并于监控系统交互数据,如图1所示。
μC/OS是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,通过联邦航空局(FAA)商用航行器认证。
监控管理整个台区的设备需要同时运管理多个设备,处理大量数据,且漏电保护,分、合闸等操作需要较高的实时性,μC/OS是实现终端功能的非常实用且低成本的选择。
2 硬件设计智能台区监控终端硬件设计以NXP Cortex M3系列处理器作为CPU ,其余芯片亦选用工业级芯片,通讯及输入输出回路进行光隔离,电压回路抗干扰处理。
具体模块如图23 软件设计整个装置软件采用嵌入式分层多任务设计理念,把软件分成系统和应用两部分,系统部分的功能主要是确保装置操作系统底层及相关驱动运行稳定可靠,而应用部分的软件功能则是为了满足工程应用,有可能,不同的工程应用,装置的应用软件会有所不同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
新器件新技术 NEW PRODUCT&TECH42 Microcontrollers &Embedded Systems 2012年第4期www.mesnet.com.cn μC/OS-III在Cortex-M3处理器上的移植李承创,陈跃斌,房晓丽,王兵(云南民族大学电气信息工程学院,昆明650031)摘要:为了将μC/OS-III移植到Cortex-M3处理器上,选用RealView MDK作为软件开发平台,针对Cortex-M3处理器特性编写了移植所需的C语言和汇编语言源代码,并验证了移植的正确性。
移植后的μC/OS-III能够稳定运行于Cortex-M3处理器上。
该移植对大部分Cortex-M3处理器具有通用性,对其他架构处理器的μC/OS-III移植具有参考作用。
关键词:μC/OS-III;嵌入式操作系统;ARM;Cortex-M3;移植中图分类号:TP316.2 文献标识码:APortingμC/OS-III to Cortex-M3ProcessorLi Chengchuang,Chen Yuebin,Fang Xiaoli,Wang bing(School of Electrical and Information Technology,Yunnan University of Nationalities,Kunming 650031,China)Abstract:In order to portμC/OS-III to Cortex-M3processor,it uses RealView MDK as the software development platform.With Cor-tex-M3processor s features,it writes the required C and assembly source code for porting,and verifies the correctness of the porting.After porting,μC/OS-III can run on Cortex-M3processor stably.The porting is universal for most Cortex-M3processor,which is a ref-erence forμC/OS-III porting on processers of other architectures.Key words:μC/OS-III;embedded operating system;ARM;Cortex-M3;porting引 言μC/OS-III是一款基于优先级调度的抢占式实时内核,Micrium公司于2011年8月公开了μC/OS-III的源码,其源码遵循ANSI C标准,因而具有良好的移植性,相信其将会被移植到越来越多的处理器体系上。
本文主要完成基于Cortex-M3处理器的μC/OS-III移植,通过本次移植,加深对嵌入式操作系统原理的理解。
此外,在μC/OS-III移植成功的基础上进行嵌入式应用程序开发,可以把主要精力集中到应用程序上,而硬件资源交由μC/OS-III管理,从而使得嵌入式应用程序更易开发和维护,在嵌入式软硬件结构变得越来越复杂的今天具有现实意义。
1 μC/OS-III和Cortex-M3特点相对以前的版本,μC/OS-III最大改进之处在于允许多个任务运行于同一优先级上,相同优先级的任务按时间片轮转调度,内核对象的数量不受限制,以及接近于零的中断禁用时钟周期。
Cortex-M3是ARM公司推出的基于ARMv7-M架构的内核,主要针对高性能、低成本和低功耗的嵌入式应用。
Cortex-M3拥有固定的存储器映射,采用更高效的NVIC(Nested Vectored Interrupt Controller)、更简单的堆栈以及更高性能的指令集,且NVIC(包括SysTick)的寄存器位置固定,极大地方便了μC/OS-III的移植及在基于Cor-tex-M3内核的处理器之间的迁移。
2 移 植2.1 移植方案本文移植μC/OS-III内核的版本为V3.02.00,其源代码下载地址见参考文献[4]。
选用意法半导体(ST)公司生产的基于Cortex-M3内核的STM32F103RBT6微控制器作为硬件实验平台,而编译环境采用RealView MDKV3.5。
Cortex-M3支持两种特权级别:特权级和用户级,μC/OS-III内核和用户代码都运行于特权级下。
Cortex-M3还支持两个栈指针MSP和PSP,μC/OS-III内核和ISR(Interrupt Service Routine)使用MSP,μC/OS-III的任务则使用PSP。
首先针对Cortex-M3处理器的特性编写与内核、CPU和BSP(Board Support Package)相关的源代码,然后创建若干个简单的用户任务,在具体的硬件平台上测试移植后NEW PRODUCT&TECH 新器件新技术 paper@mesnet.com.cn(投稿专用) 2012年第4期 43的μC/OS-III。
2.2 内核相关2.2.1 编写os_cpu.hos_cpu.h头文件主要是对上下文切换函数和时间戳获取函数进行宏定义。
μC/OS-III的上下文切换包括两种类型:任务级上下文切换OS_TASK_SW()和中断级上下文切换OSIntCtxSw()。
它们使用相同的代码置位ICSR.PENDSVSET以悬起PendSV异常,由PendSV的ISR“缓期执行”上下文切换。
OS_TS_GET()的作用是获取当前时间戳,若使能μC/OS-III的时间戳功能,则将OS_TS_GET()宏定义为CPU_TS_TmrRd(),否则简单地宏定义为0。
2.2.2 编写os_cpu_a.asm在os_cpu_a.asm文件中需要用汇编指令实现OS-StartHighRdy()函数和PendSV的ISR。
OSStartHighRdy()函数被内核用于调度第一个最高优先级的就绪任务,以开始多任务运行环境,汇编代码实现如下:OSStartHighRdyLDR R0,=NVIC_SYSPRI14LDR R1,=PRI_LOWEST;设置PendSV优先级为最低STRB R1,[R0]MOV R0,#0;设置PSP为0MSR PSP,R0LDR R0=NVIC_ICSR;挂起PendSV异常LDR R1,=PENDSVSETSTR R1,[R0]CPSIE I;确保中断使能Cortex-M3支持PendSV异常,而PendSV异常的典型应用场合就是上下文切换。
得益于Cortex-M3的中断机制,μC/OS-III上下文切换只需保存和恢复R11~R4、PSP,而PSR、PC、LR、R12、R3~R0由硬件自动保存和恢复。
PendSV的ISR汇编代码如下:PendSV_Handler;确保此标识符与中断向量表中的一致CPSID I;上下文切换期间禁用中断MRS R0,PSPCBZ R0,SkipSaving;如果PSP等于0,则跳过现场保存STMFD R0!,{R4-R11};保存R4~R11LDR R1,=OSTCBCurPtr;保存PSPLDR R2,[R1]STR R0,[R2]SkipSavingPUSH{LR};调用OSTaskSwHook()LDR R0,=OSTaskSwHookBLX R0POP{LR}LDR R0,=OSPrioCur;OSPrioCur=OSPrioHighRdyLDR R1,=OSPrioHighRdyLDRB R2,[R1]STRB R2,[R0]LDR R0,=OSTCBCurPtr;OSTCBCurPtr=OSTCBHighRdyPtrLDR R1,=OSTCBHighRdyPtrLDR R2,[R1]STR R2,[R0]LDR R0,[R2];R0=OSTCBHighRdyPtr-﹥StkPtrLDMFD R0!,{R4-R11};恢复R4~R11MSR PSP,R0;恢复PSPORR LR,#0x04;Return Stack选择PSPCPSIE I;开中断BX LR;异常返回2.2.3 编写os_cpu_c.cos_cpu_c.c文件包含了OSTaskStkInit()函数和若干钩子函数。
OSTaskStkInit()函数的作用是在创建任务时初始化任务栈,并返回新的栈顶位置。
μC/OS-III基于Cortex-M3的任务栈结构如图1所示。
其中PSR、PC、LR、R1、R0五个寄存器应赋予正确的初值,而其他11个寄存器的初值无关重要。
图1 μC/OS-III基于Cortex-M3的任务栈结构os_cpu_c.c文件中的钩子函数是μC/OS-III为了扩展用户功能而定义的。
进行μC/OS-III移植时至少需要定义OSTaskSwHook()、OSInitHook()、OSTimeTick-Hook()、OSIdleTaskHook()、OSStatTaskHook()、OSTa- 新器件新技术 NEW PRODUCT&TECH44 Microcontrollers &Embedded Systems 2012年第4期www.mesnet.com.cn skCreateHook()、OSTaskDelHook()、OSTaskReturnHook()八个钩子函数。
为了简单起见,本次移植不对钩子函数作功能扩展。
2.3 CPU相关2.3.1 编写cpu.hcpu.h头文件主要包括对标准数据类型、字长、栈、临界区的相关定义。
标准数据类型与具体的编译器相关,需要查阅相应的编译器手册。
Cortex-M3字长是32位,则CPU_DATA和CPU_ADDR皆定义为CPU_INT32U类型。
Cortex-M3使用满降序栈,栈增长方向应为从高地址到低地址。
临界区方法选用CPU_CRITICAL_METHOD_STATUS_LOCAL。
2.3.2 编写cpu_a.asmcpu_a.asm文件的最主要部分是临界区函数的实现。
根据所选用的临界区方法,中断使能函数CPU_SR_Save()和中断禁用函数CPU_SR_Restore()代码实现如下:CPU_SR_SaveMRS R0,PRIMASK;保存PRIMASK的值CPSID I;关中断BX LRCPU_SR_RestoreMSR PRIMASK,R0;恢复PRIMASK的值BX LRCortex-M3的指令集提供了CLZ指令,则可选地使用汇编指令实现CPU_CntLeadZeros()函数,以加快μC/OS-III调度器查找最高优先级的就绪任务的速度,CPU_CntLeadZeros()函数汇编代码实现如下:CPU_CntLeadZerosCLZ R0,R0BX LR2.4 BSPCortex-M3内核包含了一个SysTick定时器,可以用来给μC/OS-III提供系统时钟节拍。