如果您无法下载资料,请参考说明:
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型的变量中,强制类型转换的结果是取得了该指针所指地址与前一地址处的数据,并没有按照我们的愿望取该指针所指地址与后一地址处的数据,这样就导致了数据读取的错误。代码优化的问
as****16
实名认证
内容提供者
最近下载