历史上的今天
今天是:2025年08月11日(星期一)
2021年08月11日 | ucos-ii在MC9S12XDP512上的移植
2021-08-11 来源:eefocus
搞了几天,总算把ucos-ii移植到MC9S12XDP512上了。做个简短的笔记。
ucos-ii版本:2.52, 编译器:Freescale CodeWarrior5.9 芯片:MC9S12XDP512
移植步骤:
1. 根据向导建立新的工程,芯片选择MC9S12XDP512,其余默认配置;
2. 将ucos-ii通用源文件复制到工程的Sources目录下下:OS_CORE.C,OS_DBG.C,OS_FLAG.C,OS_MBOX.C,OS_MEM.C,
OS+MUTEX.C,OS_Q.C,OS_SEM.C,OS_TASK.C,OS_TIME.C,uCos_II.H,os_cfg.h并将这些文件添加到工程中;
3. 创建新文件,并命名为includes.h,将其添加到工程中,includes.h文件内容为:
#include #include "derivative.h" /* derivative-specific definitions */ #include #include #include #include #include "OS_CPU.H" #include "os_cfg.h" #include "uCOS_II.H" 4. 创建新文件OS_CPU.H,并将其添加到工程中,OS_CPU.H文件内容为: #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif typedef unsigned char BOOLEAN; typedef unsigned char INT8U; /* 8 bit */ typedef signed char INT8S; /* 8 bit */ typedef unsigned int INT16U; /* 16 bit */ typedef signed int INT16S; /* 16 bit */ typedef unsigned long INT32U; /* 32 bit */ typedef signed long INT32S; /* 32 bit */ typedef float FP32; /* */ typedef double FP64; /* */ typedef unsigned char OS_STK; /* */ typedef unsigned char OS_CPU_SR; // CCR 8 bits #define OS_CRITICAL_METHOD 3 #if OS_CRITICAL_METHOD == 1 #define OS_ENTER_CRITICAL() #define OS_EXIT_CRITICAL() #endif #if OS_CRITICAL_METHOD == 2 #define OS_ENTER_CRITICAL() #define OS_EXIT_CRITICAL() #endif #if OS_CRITICAL_METHOD == 3 #define OS_ENTER_CRITICAL() asm tpa;asm sei;asm staa cpu_sr /* Disable interrupt */ #define OS_EXIT_CRITICAL() asm ldaa cpu_sr;asm tap /* Enable interrupt */ #endif #define OS_STK_GROWTH 1 /* top to bottom */ #define OS_TASK_SW() asm swi /* software interrupt */ 5. 创建新文件os_cpu_c.c,并添加到工程中,os_cpu_c.c文件内容较多,主要有以下部分: 1. 以下函数均为空: OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskIdleHook(), OSTaskStatHook(),OSTimeTickHook(),OSInitHookBegin(),OSInitHookEnd(),OSTCBInitHook(), 2. OSTaskStkInit()函数内容: 该函数主要模拟中断产生时CPU的压栈过程,根据芯片资料(IS12CpuV1.pdf),中断的压栈次序为: SP+7 RTNH:RTNL (返回地址) SP+5 Y SP+3 X SP+1 D(B:A) SP CCR 由上,OSTaskStkInit()内容为: // ============================================= // 模拟中断产生初始化堆栈 // 中断产生时,堆栈压栈过程: (参见9S12cpuV1.pdf P381) /* SP+7 RTNH:RTNL (返回地址) SP+5 Y SP+3 X SP+1 D(B:A) SP CCR */ // ============================================= OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) { INT16U *wstk; INT8U *bstk; opt = opt; // 'opt' is not used, prevent warning wstk = (INT16U *)ptos; // Load stack pointer *--wstk = (INT16U)pdata; // Simulate call to function with argument *--wstk = (INT16U)(((INT32U)task) >> 8); // Return address. Format: PCH:PCL:PPAGE (cut out PPage) // 函数地址构成: PCH:PCL:PPAGE *--wstk = (INT16U)(((INT32U)task) >> 8); // 存储Y,X,D,CCR的当前值,实际任务还未开始,因此,X,Y,D,等也未用,可以随便取值,此处都取0 *--wstk = (INT16U)0x0; // Y Register *--wstk = (INT16U)0x0; // X Register *--wstk = (INT16U)0x0; // D Register bstk = (INT8U *)wstk; // Convert WORD ptr to BYTE ptr to set CCR *--bstk = (0xC0); // CCR Register (Disable STOP instruction and XIRQ) *bstk = (INT8U)task; // Save the PPAGE register // 地址低8位为PPAGE return ((OS_STK *)bstk); // Return pointer to new top-of-stack } 3. 由于CodeWarrior可以内联汇编,因此将以下4个需要由汇编编写的函数也放于Os_cpu_c.c中:OSStartHighRdy(), OSCtxSw(), OSIntCtxSw(),OSTickISR().注意,这4个函数都应该编写在非分页区,4个函数的内容为: #pragma CODE_SEG NON_BANKED void OSStartHighRdy(void) { OSTaskSwHook(); //Call Hook function asm { ldx OSTCBCur; // load the value in OSTCBCur or // 偏移量0,此处实际为堆栈指针地址 lds 0,x; inc OSRunning; //OSRunning = 1 pula; // 弹出PPAGE staa PPAGE; nop; rti; } } void OSIntCtxSw(void) { OSTaskSwHook(); //Call Hook function OSTCBCur = OSTCBHighRdy; //change OSTCBCur and OSPrioCur OSPrioCur = OSPrioHighRdy; asm { ldx OSTCBCur; //Get the new task's TCB's address lds 0,x; pula; staa PPAGE; rti; } } void interrupt 4 OSCtxSw(void) /*swi interrupt */ { asm { // 保存PPAGE ldaa PPAGE; psha; nop; // 在当前任务控制块中保存当前任务的堆栈指针 ldx OSTCBCur;
下一篇:MC9S12G128 串口通信
史海拾趣
|
常熟火灾自动报警远程监控中心昨天启用,在一间一百多平方米的监控室里,借助远程视频监控系统,接警人员只需短短3秒钟,就能迅速掌握联网单位的消防安全情况。常熟是继太原之后的全国第二家使用这一火灾报警系统的城市。 ...… 查看全部问答> |
|
【ATMEL技术问题】关于KEIL下AT91R40008启动代码问题 用KEIL 软件建立一个工程,自动生成一个启动代码STartup.S ; 但是问题来了,这个代码有点不知所云,编译出错哦啊,请大侠指点!下面是代码 /*****************************************************************************/;/* STARTUP.S: Start ...… 查看全部问答> |
|
菜鸟提问:SHBrowseForForlder()不能用,怎么代替 我是个初学者,我这个平台不能使用SHBrowseForForlder()这个方法,想找另外一个方法来代替SHBrowseForFolder,达到相同的效果, 或者可以不用打开浏览文件夹着个对话框,直接可以保存文件到指定目录也可以。劳驾各位帮忙啊… 查看全部问答> |
|
小弟刚刚做了一块基于pc104总线的DA板卡,但是现在要与基于pc104总线的3350主板进行交互,主要是对pc104总线的数据进行读取,需要制作驱动,小弟第一次开发,有那位大侠能够给一个例子或其他的资料,多谢… 查看全部问答> |
|
课后练习七之定时器 (定时器看起来简单,却搞了好久,和之前的430定时器不太一样,看了很多次,还有很多没弄出来的地方,有几个地方还是没懂) 1.TIMER_A由以下部分组成 [1] 计数器部分 输入的时钟源具有4种选择,所选择的时钟源又可 ...… 查看全部问答> |
|
最近受打击不小,这是第三块板子了,还是有问题需要向大家求助。 开发环境概况: MCU: LM3S5C56 Rev A2, 512 KB flash 64KB SRAM, 64 LQFPJ-LINK: V8, DLL version是最新 V4.52cIAR: Embedded ...… 查看全部问答> |




