4869|1

3238

帖子

5

TA的资源

五彩晶圆(中级)

楼主
 

富士通UCOS移植心得 [复制链接]

富士通9B506移植心得
首先我们要移植UCOS要知道其的软硬件的架构和具体要对那些文件进行改写。UCOS的架构图形如图所示:
从上图我们可以清晰的看到一个UCOS的结构,而我们要改写的内容主要是UC/OS-II Port文件中的OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C这三个文件,现在我分别把要改写的内容具体列出来。
第一步修改OS_CPU_C.C
/* Stack grows from HIGH to LOW memory on ARM */
#define OS_STK_GROWTH  1
第二步定义十种数据类型
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; /* Unsigned 8 bit quantity */
typedef signed char INT8S; /* Signed 8 bit quantity */
typedef unsigned short INT16U; /* Unsigned 16 bit quantity */
typedef signed short INT16S; /* Signed 16 bit quantity */
typedef unsigned int INT32U; /* Unsigned 32 bit quantity */
typedef signed int INT32S; /* Signed 32 bit quantity */ (1)
typedef float FP32; /* Single precision floating point */
typedef double FP64; /* Double precision floating point */
typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide */ (2)
typedef unsigned int OS_CPU_SR; /* Define size of CPU status register (PSR = 32 bits)*/ (3)
(1)       作为ARM CORTEX-M3是一个32位的处理器,无符号短整型和有符号短整型是被申明为INT16U,无符号整型和有符号整型是被定义为INT32U和INT32S
(2)因为堆栈在处理器上是32位的,申明OS_STK为无符号整型
(3)因为这CPU状态寄存器是32位的,申明OS_CPU_SR为无符号整型
第三步:申明宏定义
#define OS_CRITICAL_METHOD 3
#if OS_CRITICAL_METHOD == 3
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} (1)
#endif
#define OS_TASK_SW() OSCtxSw() (2)
修改OS_CPU_A.ASM
写OSStartHighRdy()
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority (1)
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0]
MOVS R0, #0 ; Set the PSP to 0 for initial context switch call (2)
MSR PSP, R0
LDR R0, =OSRunning ; OSRunning = TRUE (3)
MOVS R1, #1
STRB R1, [R0]
LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
CPSIE I ; Enable interrupts at processor level (4)
OSStartHang
B OSStartHang ; Should never get here
(1)这功能被OSSTART()调用去启动最高级优先级任务运行。设置pendSV异常优先级为最低去保障它不被用户打断
(2)设置初始化PSP为0,告诉上下文中断是第一个运行的
(3)设置OSRuning为true去启动多任务调度
(4)PendSV在使能时,PendSV异常可以仅仅被触发
改写OSCtxSw ()
OSCtxSw
LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch) (1)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
BX LR
OSCtxSw()是被调用是当OS想去执行任务上下文切换时。

OSIntCtxSw ()
OSIntCtxSw
LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch) (1)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
BX LR
修改OS_CPU_SR_Save () and OS_CPU_SR_Restore ()
OS_CPU_SR_Save
MRS R0, PRIMASK ; Set prio int mask to mask all (except faults) (1)
CPSID I
BX LR
OS_CPU_SR_Restore
MSR PRIMASK, R0 ; (2)
BX LR
改写OS_CPU_PendSVHandler
OS_CPU_PendSVHandler
CPSID I ; Prevent interruption during context switch
MRS R0, PSP ; PSP is process stack pointer (1)
CBZ R0, OS_CPU_PendSVHandler_nosave ; Skip register save the first time
SUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stack
STM R0, {R4-R11} ;(2)
LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP; (3)
LDR R1, [R1]
STR R0, [R1] ; R0 is SP of process being switched out
; At this point, entire context of process has been saved
OS_CPU_PendSVHandler_nosave
PUSH {R14} ; Save LR exc_return value
LDR R0, =OSTaskSwHook ; OSTaskSwHook(); (4)
BLX R0
POP {R14}
LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy; (5)
LDR R1, =OSPrioHighRdy
LDRB R2, [R1]
STRB R2, [R0]
LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy; (6)
LDR R1, =OSTCBHighRdy
LDR R2, [R1]
STR R2, [R0]
LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr; (7)
LDM R0, {R4-R11} ; Restore r4-11 from new process stack (8)
ADDS R0, R0, #0x20
MSR PSP, R0 ; Load PSP with new process SP
ORR LR, LR, #0x04 ; Ensure exception return uses process stack
CPSIE I
BX LR ; Exception return will restore remaining context (8)
(1)       得到处理器SP,如果0那么就跳到保护单元
(2)       保存寄存器R4-R11在处理器堆栈中
(3)       保存处理器SPTCBOSTCBcur->OSTCBstkPtr设置为SP
(4)       调用OSTaskSWHook()
(5)       得到当前最高优先级,OSPrioCut=OSPrioHighRdy
(6)       得到当前预备线程TCB,OSTCBCur=OSTCBHighRdy
(7)       得到新处理器SP从TCB中,SP=OSTCBHighRdy->OSTCBStkPtr
(8)       修复R4-R11从新的处理器堆栈
(9)       执行异常返回它将修复保存的上下文
修改OS_CPU_C.C
OSTaskStkInit
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
(void)opt; /* 'opt' is not used, prevent warning */
stk = ptos; /* Load stack pointer */
/* Registers stacked as if auto-saved on exception */
/* (1) */
*(stk) = (INT32U)0x01000000L; /* xPSR */
*(--stk) = (INT32U)task; /* Entry Point */
*(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/
*(--stk) = (INT32U)0x12121212L; /* R12 */
*(--stk) = (INT32U)0x03030303L; /* R3 */
*(--stk) = (INT32U)0x02020202L; /* R2 */
*(--stk) = (INT32U)0x01010101L; /* R1 */
*(--stk) = (INT32U)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*(--stk) = (INT32U)0x11111111L; /* R11 */
*(--stk) = (INT32U)0x10101010L; /* R10 */
*(--stk) = (INT32U)0x09090909L; /* R9 */
*(--stk) = (INT32U)0x08080808L; /* R8 */
*(--stk) = (INT32U)0x07070707L; /* R7 */
*(--stk) = (INT32U)0x06060606L; /* R6 */
*(--stk) = (INT32U)0x05050505L; /* R5 */
*(--stk) = (INT32U)0x04040404L; /* R4 */
return (stk);
}
修改OS_CPU_SysTickInit
void OS_CPU_SysTickInit (void)
{
INT32U cnts;
cnts = OS_CPU_CM3_FREQ / OS_TICKS_PER_SEC; (1)
OS_CPU_CM3_NVIC_ST_RELOAD = (cnts - 1); /* Enable timer. */
OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC | OS_CPU_CM3_NVIC_ST_CTRL_ENABLE;(2) /* Enable timer interrupt. */
OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_INTEN; (3)
}

OS_CPU_SysTickHandler
void OS_CPU_SysTickHandler (void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
OSIntNesting++; /* (1) */
OS_EXIT_CRITICAL();
OSTimeTick(); /* Call uC/OS-II's OSTimeTick() (2) */
OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */
}
测试了AD,LCD,PWM,DS18B20,和按键。版本是IAR6.10,本来是想在DIY板子上测试的,可惜烧写时出了问题,没办法只好放在上面弄了,不过代码可以直接上板子上运行。还有一份驱动彩屏的驱动程序,屏控制器为ILI9325.代码已经写好。用的是16位模式。还有几份单独的驱动,也是之前测试通过的,由于感觉比较简单所以之前没公布。


[ 本帖最后由 wateras1 于 2012-8-9 13:37 编辑 ]

B3[VS6RFNB7}VJKV`UB{TZF.jpg (43.98 KB, 下载次数: 0)

B3[VS6RFNB7}VJKV`UB{TZF.jpg

DSC00678.JPG (2.41 MB, 下载次数: 0)

DSC00678.JPG

DSC00680.JPG (2.25 MB, 下载次数: 0)

DSC00680.JPG

3.jpg (39.32 KB, 下载次数: 0)

3.jpg

富士通项目代码.zip

328.25 KB, 下载次数: 26

ILI9325.pdf

1.17 MB, 下载次数: 9

ILI9325_TFT驱动中文资料.pdf

953.89 KB, 下载次数: 9

MB9B506ADC.zip

333.55 KB, 下载次数: 14

MB9B506蜂鸣器.zip

324.87 KB, 下载次数: 12

MB5096TFT,DS18B20和串口代码.zip

410.47 KB, 下载次数: 15

最新回复

谢谢分享  详情 回复 发表于 2016-6-18 22:45
点赞 关注(1)
 

回复
举报

5

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
谢谢分享
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表