移植ucosII到STM32F103ZE(一)
时间:11-25
来源:互联网
点击:
一、开发环境:
1. 开发环境: keil uvision4 MDK4.12(windows XP)
MDK即RealView MDK(Microcontroller Development kit),是 ARM 公司目前最新推出的针对各种嵌入式处理器的软件开发工具。RealView MDK 集成了业内最领先的技术,包括 uVision4 集成开发环境与 RealView 编译器。支持 ARM7、ARM9 和最新的 Cortex-M3/M1/M0 核处理器,自动配置启动代码,集成 Flash 烧写模块,强大的 Simulation 设备模拟,性能分析等功能,与 ARM 之前的工具包 ADS 等相比,RealView 编译器的最新版本可将性能改善超过 20%。
RealView MDK的突出特性:
菜鸟的阿拉伯飞毯—— 启动代码生成向导,自动引导,一日千里
启动代码和系统硬件结合紧密,必须用汇编语言编写,因而成为许多工程师难以跨越多门槛。RealView MDK的µVision3工具可以帮您自动生成完善的启动代码,并提供图形化的窗口,随您轻松修改。无论对于初学者还是有经验的开发工程师,都能大大节省时间,提高开发效率。
高手的无剑胜有剑 —— 软件模拟器,完全脱离硬件的软件开发过程
RealView MDK的设备模拟器可以仿真整个目标硬件,包括快速指令集仿真、外部信号和I/O仿真、中断过程仿真、片内所有外围设备仿真等。开发工程师在无硬件的情况下即可开始软件开发和调试,使软硬件开发同步进行,大大缩短开发周期。而一般的ARM开发工具仅提供指令集模拟器,只能支持ARM内核模拟调试。
专家的哈雷望远镜 —— 性能分析器,看得更远、看得更细、看得更清
RealView MDK的性能分析器好比哈雷望远镜,让您看得更远和更准,它辅助您查看代码覆盖情况,程序运行时间,函数调用次数等高端控制功能,指导您轻松的进行代码优化,成为嵌入式开发高手。通常这些功能只有价值数千美元的昂贵的Trace工具才能提供。
业界最优秀的编译器——RealView 编译器,代码更小,性能更高。
2. 处理器: STM32F103ZET6(神舟III号板)
3. OS版本: uC/OS-II V2.86
4. 外设库版本:STM32F10x_StdPeriph_Lib_V3.5.0
5. 源码下载:
1) 从st公司网站下载最新版本的stm32标准外设库,版本是V3.5.0(2012-11-16)
http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip
2) 下载uC/OS-II V2.86:
先去micrium网址注册账号
http://micrium.com/page/home
然后登陆并下载
http://micrium.com/newmicrium/uploads/file/appnotes/secure/Micrium-ST-uCOS-II-LCD-STM32.exe
二、 硬件资源介绍:
1. 简介:
STM32F103ZET6是STM32F103系列最高端配置芯片,cortex-M3内核的32位处理器(内部数据路径,寄存器,存储器都是32位),采用哈佛结构,72M主频,LQFP144封装,片上有512K的flash和64K的SRAM。
STM32家族主要产品系列家谱
2. 指令系统:
Cortex-M3只是用32位的thumb2指令。在支持了16位和32位的thumb-2指令集支持,cortex-M3无需把状态在thumb和ARM之间来回的去换,尤其在使用大型条件嵌套以及执行复杂运算的时候,cortex-M3要比老一辈的ARM7执行效率要高很多。
3. 寄存器组:
Cortex-M3处理器拥有R0-R15的寄存器组,其中R13作为堆栈指针SP。SP有两个,但在同一时刻只能有一个可以看到。这也就是所谓的“banked”寄存器。
R0-R12 都是32 位通用寄存器,用于数据操作。但是注意:绝大多数16 位Thumb 指令只能访问R0-R7,而32 位Thumb-2 指令可以访问所有寄存器。
Cortex-M3 拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。
主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
进程堆栈指针(PSP):由用户的应用程序代码使用。
堆栈指针的最低两位永远是0,这意味着堆栈总是4 字节对齐的。
寄存器及其功能:
xPSR 记录ALU 标志(0 标志,进位标志,负数标志,溢出标志),执行状态,以及当前服务的中断号
PRIMASK 除能所有的中断——当然了,不可屏蔽中断(NMI)才不甩它呢。
FAULTMASK 除能所有的fault——NMI 依然不受影响,而且被除能的faults 会“上访”,
BASEPRI 除能所有优先级不高于某个具体数值的中断。
CONTROL 中断屏蔽寄存器组,有两个作用:
a、定义特权级别;b、选择当前使用哪个堆栈指针。
4. 操作模式和特权极别:
Cortex-M3处理器制程两种处理器模式和两种特权操作。
两种模式分别是处理者模式(handler mode)和线程模式(thread mode),主要是用于区别普通应用程序的代码和异常服务例程的代码(包括中断服务例程的代码)。
两种特权分级是特权级和用户级,用于提供一种存储访问的保护机制,使得普通的用户程序代码不能意外地或者恶意地执行涉及到要害的操作。
ucosii不区分特权级和用户级,程序始终工作在特权级,因此两个堆栈指针的切换是全自动的,就在出入异常服务例程时由硬件处理。
5. 存储器映射:
CM3的存储系统与传统ARM架构的相比,有过脱胎换股般的改革:
第一,它的存储器映射是预定义的,并且还规定好了哪个位置使用哪条总线。
第二,CM3 的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中。
http://blog.sina.com.cn/s/blog_abd39cc70101ci44.html
第三,CM3 的存储器系统支持非对齐访问和互斥访问。这两个特性是直到了ARMv7-M 时才出来的。
最后,CM3 的存储器系统支持both小端配置和大端配置。
CM3 只有一个单一固定的存储器映射。这一点极大地方便了软件在各种CM3 单片机间的移植。存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“私有外设区”。私有外设区的组件包括:
1) 闪存地址重载及断点单元(FPB)
2) 数据观察点单元(DWT)
3) 仪器化跟踪宏单元(ITM)
4) 嵌入式跟踪宏单元(ETM)
5) 跟踪端口接口单元(TPIU)
? ROM表
CM3 的地址空间是4GB, 程序可以在代码区,内部SRAM 区以及外部RAM 区中执行。但是因为指令总线与数据总线是分开的,最理想的是把程序放到代码区,从而使取指和数据访问各自使用自己的总线,并行不悖。
Cortex-M3 预定义的存储器映射
CM3在定义了存储器映射之外,还为存储器的访问规定了4种属性,分别是:
? 可否缓冲(Bufferable)
? 可否缓存(Cacheable)
? 可否执行(Executable)
? 可否共享(Sharable)
6. 总线接口:
Cortex-M3使用一个3级流水线,分别是:取指,解码和执行。
详细的框图
五总线:I-Code总线,D-Code总线和系统总线,外部私有外设总线和调试访问端口总线
7. 异常
Cortex-M3异常类型:
Cortex-M3异常类型分为两种,分别是系统异常(编号1-15,0号为没有异常在运行)和外部中断(大于等于16号)。原则上,CM3支持3个固定的高优先级和多大256级的可编程优先级。后240个是外部中断,也就是“意外突发事件”,来自各种片上外设和外扩的外设,属于异步的,而前15种异常是CM3内部活动产生的,对CM3来说是同步的。
NVIC中,每个中断都有一个优先级配置寄存器(1个byte),用来配置该中断的优先级。但该寄存器并不是每个位都被使用,不同制造商生产的芯片不相同,例如STM32使用4位,也就是说stm32支持16个可编程优先级。
注意该寄存器是以MSB对齐的,因此stm32每个中断的优先级配置寄存器7:4位有效,3:0位无效。
《STM32_RM_CH_V10_1所有型号中文参考手册》130
Cortex-M3异常类型
Cortex-M3 中断优先级:
对于优先级,CM3又分为抢占优先级和亚优先级,NVIC中的应用程序中断及复位控制寄存区(AIRCR)的优先级分组(10:8)描述如何划分抢占优先级和亚优先级。(具体看数据手册)
Cortex-M3异常向量表
向量表:当发生了异常并且要响应它时,CM3需要定位其服务例程的入口地址,这些入口地址存储在异常向量表中。
地址0处是存储引导代码,通常映射到Flash或者ROM器件,并且它们的值不得在运行时改变。但是,为了支持动态重发中断,CM3允许向量表重定位—从其它地址开始定位各异向量。这些地址对应的区域可以是代码区,但更多的是在RAM区。在RAM就可以修改向量的入口地址了。NVIC中的一个寄存器叫做“向量表偏移量寄存器”(VTOR)(在地址0xE000_ED08处),通过修改它的值就能重定位向量表。
SVC和PendSV
SCV(系统服务调用,也简称系统调用)和PendSV(可悬起系统调用),这两个多用在上了操作系统的软件开发中。SVC用于产生系统函数的调用请求,例如操作系统通常不让用户程序直接访问硬件而是通过提供一些系统服务函数,让用户程序通过SVC发出对系统服务函数的呼叫请求。主要是用于分特权级和用户级的操作系统,ucosii不区分特权级和用户级。移植时这个可以删除。
PendSV,可悬起的系统调用,可以像普通中断一样被悬起,PendSV一般是使用在上下文切换时,就是任务切换,是ucosii移植过程中最重要的中断。主要有两点:
a、 PendSV中断时手工往NVIC的PendSV悬起寄存器中写入1产生的(由OS写)。
b、 PendSV中断优先级必须设为最低。
8. NVIC与中断控制
NVIC,向量中断控制器,是cortex-M3不可分离的部分,与内核的逻辑紧密耦合。NVIC的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑外,还包含MPU,SysTick定时器以及调试控制相关的寄存器。 NVIC的访问地址为0xE000_E000。(具体看数据手册)
每个外部中断都在NVIC的下列寄存器中“挂号”:
Ø 使能与除能寄存器
Ø 悬起与“解悬”寄存器
Ø 优先级寄存器
Ø 活动状态寄存器
另外,下列寄存器也对中断处理有重大影响:
Ø 异常掩蔽寄存器
Ø 向量表偏移寄存器
Ø 软件触发中断寄存器
Ø 优先级分组位段
9. 中断的行为:
当CM3开始响应一个中断时:
1.xPSR, PC, LR, R12以及R3‐R0入栈;
2.取向量;
3.选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC。
对移植ucosii 来说,需要注意1,3
嵌套的中断:
CM3内核以及NVIC,已经内建了对中断嵌套的全力支持,根本无需使用汇编去写封皮代码(wrapper code),注意中断嵌套不能过深即可。
10. 其它的看数据手册,例如STM32F10x的模块,如:电源控制,DMA控制器,ADC与DAC,定时器,看门狗与窗口看门狗,静态存储器控制器(FSMC),USB,控制器局域网CAM总线,同步异步收发等,看stm32F10x数据手册。
1.
MDK即RealView MDK(Microcontroller Development kit),是 ARM 公司目前最新推出的针对各种嵌入式处理器的软件开发工具。RealView
RealView MDK的突出特性:
菜鸟的阿拉伯飞毯—— 启动代码生成向导,自动引导,一日千里
启动代码和系统硬件结合紧密,必须用汇编语言编写,因而成为许多工程师难以跨越多门槛。RealView MDK的µVision3工具可以帮您自动生成完善的启动代码,并提供图形化的窗口,随您轻松修改。无论对于初学者还是有经验的开发工程师,都能大大节省时间,提高开发效率。
高手的无剑胜有剑 —— 软件模拟器,完全脱离硬件的软件开发过程
RealView MDK的设备模拟器可以仿真整个目标硬件,包括快速指令集仿真、外部信号和I/O仿真、中断过程仿真、片内所有外围设备仿真等。开发工程师在无硬件的情况下即可开始软件开发和调试,使软硬件开发同步进行,大大缩短开发周期。而一般的ARM开发工具仅提供指令集模拟器,只能支持ARM内核模拟调试。
专家的哈雷望远镜 —— 性能分析器,看得更远、看得更细、看得更清
RealView MDK的性能分析器好比哈雷望远镜,让您看得更远和更准,它辅助您查看代码覆盖情况,程序运行时间,函数调用次数等高端控制功能,指导您轻松的进行代码优化,成为嵌入式开发高手。通常这些功能只有价值数千美元的昂贵的Trace工具才能提供。
业界最优秀的编译器——RealView 编译器,代码更小,性能更高。
2.
3.
4.
5.
1)
http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip
2)
先去micrium网址注册账号
http://micrium.com/page/home
然后登陆并下载
http://micrium.com/newmicrium/uploads/file/appnotes/secure/Micrium-ST-uCOS-II-LCD-STM32.exe
二、
1.
STM32F103ZET6是STM32F103系列最高端配置芯片,cortex-M3内核的32位处理器(内部数据路径,寄存器,存储器都是32位),采用哈佛结构,72M主频,LQFP144封装,片上有512K的flash和64K的SRAM。
STM32家族主要产品系列家谱
2.
Cortex-M3只是用32位的thumb2指令。在支持了16位和32位的thumb-2指令集支持,cortex-M3无需把状态在thumb和ARM之间来回的去换,尤其在使用大型条件嵌套以及执行复杂运算的时候,cortex-M3要比老一辈的ARM7执行效率要高很多。
3.
Cortex-M3处理器拥有R0-R15的寄存器组,其中R13作为堆栈指针SP。SP有两个,但在同一时刻只能有一个可以看到。这也就是所谓的“banked”寄存器。
R0-R12 都是32 位通用寄存器,用于数据操作。但是注意:绝大多数16 位Thumb 指令只能访问R0-R7,而32 位Thumb-2 指令可以访问所有寄存器。
Cortex-M3 拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。
主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
进程堆栈指针(PSP):由用户的应用程序代码使用。
堆栈指针的最低两位永远是0,这意味着堆栈总是4 字节对齐的。
寄存器及其功能:
xPSR
PRIMASK
FAULTMASK
BASEPRI
CONTROL
a、定义特权级别;b、选择当前使用哪个堆栈指针。
4.
Cortex-M3处理器制程两种处理器模式和两种特权操作。
两种模式分别是处理者模式(handler mode)和线程模式(thread mode),主要是用于区别普通应用程序的代码和异常服务例程的代码(包括中断服务例程的代码)。
两种特权分级是特权级和用户级,用于提供一种存储访问的保护机制,使得普通的用户程序代码不能意外地或者恶意地执行涉及到要害的操作。
ucosii不区分特权级和用户级,程序始终工作在特权级,因此两个堆栈指针的切换是全自动的,就在出入异常服务例程时由硬件处理。
5.
CM3的存储系统与传统ARM架构的相比,有过脱胎换股般的改革:
第一,它的存储器映射是预定义的,并且还规定好了哪个位置使用哪条总线。
第二,CM3 的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中。
http://blog.sina.com.cn/s/blog_abd39cc70101ci44.html
第三,CM3 的存储器系统支持非对齐访问和互斥访问。这两个特性是直到了ARMv7-M 时才出来的。
最后,CM3 的存储器系统支持both小端配置和大端配置。
CM3 只有一个单一固定的存储器映射。这一点极大地方便了软件在各种CM3 单片机间的移植。存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“私有外设区”。私有外设区的组件包括:
1)
2)
3)
4)
5)
? ROM表
CM3 的地址空间是4GB, 程序可以在代码区,内部SRAM 区以及外部RAM 区中执行。但是因为指令总线与数据总线是分开的,最理想的是把程序放到代码区,从而使取指和数据访问各自使用自己的总线,并行不悖。
Cortex-M3 预定义的存储器映射
CM3在定义了存储器映射之外,还为存储器的访问规定了4种属性,分别是:
? 可否缓冲(Bufferable)
? 可否缓存(Cacheable)
? 可否执行(Executable)
? 可否共享(Sharable)
6.
Cortex-M3使用一个3级流水线,分别是:取指,解码和执行。
7.
Cortex-M3异常类型:
Cortex-M3异常类型分为两种,分别是系统异常(编号1-15,0号为没有异常在运行)和外部中断(大于等于16号)。原则上,CM3支持3个固定的高优先级和多大256级的可编程优先级。后240个是外部中断,也就是“意外突发事件”,来自各种片上外设和外扩的外设,属于异步的,而前15种异常是CM3内部活动产生的,对CM3来说是同步的。
NVIC中,每个中断都有一个优先级配置寄存器(1个byte),用来配置该中断的优先级。但该寄存器并不是每个位都被使用,不同制造商生产的芯片不相同,例如STM32使用4位,也就是说stm32支持16个可编程优先级。
注意该寄存器是以MSB对齐的,因此stm32每个中断的优先级配置寄存器7:4位有效,3:0位无效。
《STM32_RM_CH_V10_1所有型号中文参考手册》130
Cortex-M3异常类型
Cortex-M3 中断优先级:
对于优先级,CM3又分为抢占优先级和亚优先级,NVIC中的应用程序中断及复位控制寄存区(AIRCR)的优先级分组(10:8)描述如何划分抢占优先级和亚优先级。(具体看数据手册)
Cortex-M3异常向量表
向量表:当发生了异常并且要响应它时,CM3需要定位其服务例程的入口地址,这些入口地址存储在异常向量表中。
SVC和PendSV
SCV(系统服务调用,也简称系统调用)和PendSV(可悬起系统调用),这两个多用在上了操作系统的软件开发中。SVC用于产生系统函数的调用请求,例如操作系统通常不让用户程序直接访问硬件而是通过提供一些系统服务函数,让用户程序通过SVC发出对系统服务函数的呼叫请求。主要是用于分特权级和用户级的操作系统,ucosii不区分特权级和用户级。移植时这个可以删除。
PendSV,可悬起的系统调用,可以像普通中断一样被悬起,PendSV一般是使用在上下文切换时,就是任务切换,是ucosii移植过程中最重要的中断。主要有两点:
a、
b、
8.
NVIC,向量中断控制器,是cortex-M3不可分离的部分,与内核的逻辑紧密耦合。NVIC的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑外,还包含MPU,SysTick定时器以及调试控制相关的寄存器。 NVIC的访问地址为0xE000_E000。(具体看数据手册)
每个外部中断都在NVIC的下列寄存器中“挂号”:
Ø
Ø
Ø
Ø
另外,下列寄存器也对中断处理有重大影响:
Ø
Ø
Ø
Ø
9.
当CM3开始响应一个中断时:
1.xPSR, PC, LR, R12以及R3‐R0入栈;
2.取向量;
3.选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC。
对移植ucosii 来说,需要注意1,3
嵌套的中断:
CM3内核以及NVIC,已经内建了对中断嵌套的全力支持,根本无需使用汇编去写封皮代码(wrapper code),注意中断嵌套不能过深即可。
10.
移植ucosIISTM32F103Z 相关文章:
- 移植ucosII到STM32F103ZE(四)(11-25)
- 移植ucosII到STM32F103ZE(二)(11-25)
- 移植ucosII到STM32F103ZE(五)(11-25)
- 移植ucosII到STM32F103ZE(六)(11-25)
- 移植ucosII到STM32F103ZE(三)(11-25)
- 移植ucosII到STM32F103ZE(七)(11-25)