第八章 嵌入式操作系统软件设计(下UCOS分析,参考资料).ppt 立即下载
2024-09-12
约2.5千字
约31页
0
98KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

第八章 嵌入式操作系统软件设计(下UCOS分析,参考资料).ppt

第八章嵌入式操作系统软件设计(下UCOS分析,参考资料).ppt

预览

免费试读已结束,剩余 26 页请下载文档后查看

15 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第八章C/OS一、嵌入式操作系统的移植

二、SDT工具的使用

移植的概念和目的

C/OS-II的移植

软件移植
移植的概念和目的移植的要求:
移植对象具有硬件无关性
移植对象具有系统无关性
移植对象采用标准语言编程C/OS-II的移植C/OS–II的软硬件体系结构µC/OS-II目录结构与代码组织
可从µC/OS-II网站www.ucos-II.com下载;C/OS-II移植需要满足的要求开/关中断:
在C/OS-II中,可以通过:
OS_ENTER_CRITICAL()
OS_EXIT_CRITICAL()
宏来控制系统关闭或者打开中断。这需要处理器的支持。
在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。处理器支持中断并能产生定时中断:
C/OS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM7TDMI的处理器上可以产生定时器中断。
本系统工作在60MHz的主频下,定时器的中断的频率为1000Hz。也就是系统的响应时间为1ms。处理器支持硬件中断:
C/OS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是C/OS-II多任务调度的基础。
ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。开发工具:

针对所使用的CPU	的标准C交叉编译器
C编译器支持汇编语言程序
C编译器还须提供一种机制,能在C语言中开中断和关中断。C/OS-II移植的主要工作与处理器相关的代码有:
OS_CPU.H
OS_CPU_A.ASM
OS_CPU_C.COS_CPU.H包含了用#define语句定义的、与处
理器相关的常数、宏以及类型。

OS_CPU.H中定义了与编译器相关的数据类型,比如:INT8U、INT8S等。
与ARM处理器相关的代码,使用
OS_ENTER_CRITICAL()和
OS_EXIT_CRITICAL()宏开启/关闭中断
设施堆栈的增长方向:堆栈由高地址向低地址增长
用C语言编写十个操作系统相关的函数(OS_CPU_C.C)
OSTaskStkInit()
OSTaskCreatHook()
OSTaskDelHook()
OSTaskSwHook()
OSTaskIdleHook()
OSTaskStatHook()
OSTimeTickHook()
OSInitHookBegin()
OSInitHookEnd()
OSTCBInitHook()
其中唯一必要的函数是OSTaskStkInit(),其他9个函数必须声明,但不一定要包含任何代码。
C/OS-II中每个任务都有自己的任务堆栈,在任务创建初期由初始化OSTaskStkInit()初始化。初始化堆栈的目的就是模拟一次中断。任务堆栈中保存了任务代码的起始地址和一些CPU寄存器(初值是无关紧要的),这样一旦条件满足,就可以执行该任务了。
用汇编语言编写四个与处理器相关的函
数(OS_CPU.ASM)
OSStartHighRdy()
OSCtxSw()
OSIntCtxSw()
OSTickISR()在每个硬件时钟到来后,C/OS-II会在中断服务例程中调用OSIntCtxSw()进行任务调度;另外,当某个任务因等待资源而被挂起时,没有必要等到自己的时间片全都用完,可以自己主动放弃CPU,这可以通过调用一个任务级的任务调度函数OSCtxSw()来实现。
其中相对复杂的是OSIntCtxSw()。由于OSTickISR()调用了OSIntExit(),OSIntExit()又再次调用了OSIntCtxSw(),如果进行任务切换,那么两次调用都不会返回,而不同的C编译器、不同的编译选项处理C调用时对堆栈的使用也不尽相同。因此OSIntCtxSw()是编译器相关的。测试移植代码向嵌入式平台移植软件字节顺序字节对齐结构TEST在单字节对齐的平台上占内存三个字节,而在以上所述的嵌入式平台上有可能占三个或四个字节,视成员a的存储地址而定。当a存储地址为偶数时,该结构占四个字节,在a与b之间存在一个字节的空洞。对于通信双方都是对结构成员操作的,这种情况不会出错,但如果有一方是逐字节读取内容的(通信协议大都如此),就会错误地读到其它字节的内容。其次,若对内存中数据以强制类型转换的方式读取,字节对齐的不同会引起数据读取的错误。因为假如指针指在基数内存地址处,我们想取得占内存两个字节的数据存放在uint16型的变量中,强制类型转换的结果是取得了该指针所指地址与前一地址处的数据,并没有按照我们的愿望取该指针所指地址与后一地址处的数据,这样就导致了数据读取的错误。代码优化的问
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

第八章 嵌入式操作系统软件设计(下UCOS分析,参考资料)

文档大小:98KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用