完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以下介绍如何将μC/OS-II移植到MOTOROLA MC68K系列CPU上。
一、MC68K CPU简介 MC68K及68020、68040等的著名的MOTOROLA32位微处理器,和与之兼容的68K、CPU32、CPU32+等CPU扩充定时处理单元TPU、队列串行模块QSM、系统控制模块和RAM等组成MC683xx系列单片机。 CPU32 内部有8个32位通用数据寄存器,8个32位通用地址寄存器。8个通用数据寄存器可作为累加器使用,也可看成C语言中各种类型的变量;8个通用地址寄存器,可作为变址寄存器使用,也可看成C语言中的指针型变量。CPU32有独立的用户堆栈指针和系统堆栈指针,可区分程序区、数据区、系统区、用户区等存储空间,有7级中断。 要实现μC/OS-II向MC68K的移值,需要有MC68K的C编译器。我们使用的HIWARE公司的C编译器。该C编译器允许嵌入行汇编。 |
|
相关推荐
2个回答
|
|
二、移植中所需修改的文件
和CPU相关的文件主要有三个:C语言文件OS_CPU32.C、头文件OS_CPU32.H和汇编文件OS_CPU32.ASM。 1.INCLUDES.H文件 INCLUDES.H 是主头文件,在所有后缀名为.C文件的开始都包含INCLUDES.H文件。对于不同类型的处理器,用户需要改定INCLUDES.H文件,增加自己的头文件,但必须加在文件末尾。在安装μC/OS-II的时候,附带了几个移植实例,例如,针对Intel 80x86的代码安装到IIL目录。我们为MC68K编写的移植实例都放在II下,在INCLUDES.H文件中增加有: #include iiK_CPU32.ASM #include iiK_CPU32.C #include iiK_CPU32.H 2.OS_CPU32.H文件 OS_CPU32.H文件中定义了与硬件相关的基本信息: typedef unsigned char INT8U; /*无符号8位数*/ typedef signed char INT8S; /*带符号8位数*/ typedef unsigned int INT16U; /*无符号16位数*/ typedef signed int INT16S; /*带符号16位数*/ typedef signed long INT32S; /*带符号32位数*/ typedef unsigned int OS_STK; /*堆栈入口宽度为16位*/ #define OS_STK_GROWTH1 /*堆栈由高地址向低地址增长*/ #define UCOS 0 /*用于任务切换的软中断*/ define OS_TASK_SW() _TRAP(UCOS) #define OS_ENTER_CRITICAL() move.w#$2700,SR /*进入临界区*/ #define OS_EXIT_CRITICAL() move.w #$2000,SR /*退出临界区*/ (1)数据类型 由于不同的处理器有不同的字长,μC/OS-II的移植需要重新定义一系列的数据结构。由于MC68K为32位MCU,整数(int)类型数据为16位,长整开有(long)为32位。在MC68K中堆栈都是按字进行操作的,所以堆栈数据类型OS_STK声明为16位。所有的堆栈必须用OS_STK声明。 (2)代码临界区 μC/OS -II在进入系统临界代码区之间要关中断,等到退出临界区后再打开,从而保护核心数据不被多任务环境下的其他任务或中断破坏。在MC68K中,开关中断可以通过设置状态寄存器SR中的中断屏蔽位来实现。μC/OS-II中的宏OS_ENTER_CRITICAL()定义将状态寄存器的中断屏蔽位置位,屏蔽所有的七级中断;OS_EXIT_CRITICAL()定义将状态寄存器的中断屏蔽位清零,打开所有的七级中断。这种处理方法非常简单,但CPU32提供分级中断机制得不到使用。如果要使用分级中断,必须改写一些相关的函数,将在第4节中阐明。 (3)堆栈方向 MC68K处理器的堆栈是由高地址向低地址递减的,所以OS_STK_GROWTH必须设置为1。 (4)OS_TASK_SW()函数的定义 在μC/OS -II中,OS_TASK_SW()用来实现任务切换。就绪任务的堆栈初始化应该模拟一次中断发生后的样子,椎栈中应该按入栈次序设置好各个寄存器。 OS_TASK_SW()函数模拟一次断过程,在中断返回的进修进行任务切换。CPU32有16个软中断可供选用,称为陷阱TRAP调用。中断程序程序的入口必须指向汇编函数OSCtxSw()。 我们在μC/OS-II所提供的例程中使用的0号陷阱调用,由下面的语句完成定义: #define OS_TASK_SW() -TRAP(UCOS) |
|
|
|
3.OS_CPU32.ASM文件
μC/OS-II的移植需要用户改写OS_CPU_A.ASM中的4个函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()。 (1)OSStartHighRdy()函数 该函数由OSStart()函数调用,功能是运行优先级最高的就绪态任务。在调用OSStart()之前,用户必须先调用OSInit(),并且已经至少创建了一个任务。为启动任务,OSStartHighRdy()首先找到当前就绪的优先级最高的任务,OSTCBHighRdy中保存有优先级最高任务的任务控制块(TCB)的地址,并从任务的任务控制块中找到指向堆栈的指针,然后运行指令MOVEM.L(A7)+,A0-A6/D0-D7,从堆栈中弹出全部寄存器的内容,运行RTE中断返回。由于任务创建时堆栈的结构就是按中断捕捞堆栈结构初始化的,执行RET指令后就切换到了新任务。有关μC/OS- II的任务切换机制,请参考系列计座(3). OSStartHighRdy的汇编代码如下: _OSStarHighRdy MOVE.L(_OSTCBHighRdy),A1 ;获取最高优先级就绪任务的TCB地址 MOVE.L A1,(_OSTCBCur) MOVE.L (A1),A7 ;取得堆栈指针 MOVEM.L (A7)+,A0-A6/D0-D7 RTE ;中断返回,切换任务 |
|
|
|
只有小组成员才能发言,加入小组>>
1906个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36358 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4395 浏览 0 评论
6050 浏览 1 评论
6763 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4212 浏览 0 评论
619浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
614浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
606浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
694浏览 2评论
796浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 07:26 , Processed in 1.326375 second(s), Total 103, Slave 86 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号