查看: 3470|回复: 5

[报名/申请] 【飞思卡尔“新”礼三重奏】 jasonwangse的方案

[复制链接]

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
发表于 2013-8-29 19:19:19 | 显示全部楼层

【飞思卡尔“新”礼三重奏】 jasonwangse的方案

在一些对实时性有要求的场合中,对于应用开发者来说,系统上能运行一个实时操作系统是一个多么惬意的事情。早期的8位MCU,ROM和RAM空间均有限,即使花了很大的力气在上面实现了一个操作系统,再在上面跑应用已经是“无地自容”了。Kinetis E系列MCU有64K的ROM和4K的RAM,再加上内部时钟等浑然天成的外设,在上面运行一个小型的操作系统已经是绰绰有余了。我计划在Kinetis E开发板上将uC/OS II跑起来,并通过UART、Timer以及I2C等简单的外围设备做以验证,实现一个小型的实时操作系统,可以在一些有实时性要求的场景中使用。期望开发板~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
 楼主| 发表于 2013-8-30 11:42:45 | 显示全部楼层

RE:【飞思卡尔“新”礼三重奏】 jasonwangse的方案

对于移植一个操作系统而言,关键的就是三点:1.内存的映射及管理;2.异常及中断的实现与适配;3.任务调度时现场的保存,我们从最基本的开始做起:内存的映射和管理。由于Cortex-M0+支持的是ARMv6的MPU模块,我们就结合这个MPU模块和M0+本身的内存映射来分析操作系统内存的映射及管理。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
 楼主| 发表于 2013-9-1 17:50:30 | 显示全部楼层

RE:【飞思卡尔“新”礼三重奏】 jasonwangse的方案

1.内存的映射及管理
对于内存映射,参考MKE02Z64VQH2的Reference Manual之后发现,这款M0+的MCU是没有MPU模块的,也就是说没有了内存访问权限的限制。这样,内存视图就是完全按照手册中第四章的system memory map来定义就可以了。不过针对SRAM,分成了SRAM_L: Lower SRAM(0x1FFF_FC00–0x1FFF_FFFF)和SRAM_U: Upper SRAM(0x2000_0000–0x2000_0BFF)两个区域;而CPU的两种模式下SP又可以分别指定为PSP和MSP,我们计划将Handler mode的栈空间设定在SRAM_L区域,将数据段、堆以及Thread mode的栈空间设定在SRAM_H区域。其他的注意细节暂时还没考虑到。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
 楼主| 发表于 2013-9-2 18:50:39 | 显示全部楼层

RE:【飞思卡尔“新”礼三重奏】 jasonwangse的方案

2.异常及中断的实现与适配
由于Handler mode的栈空间设定在了SRAM_L区域,而Handler mode只能使用MSP,所以在系统初始化时将MSP设置在SRAM_L的高端,将PSP设置在SRAM_H的高端(M0+采用的是满递减堆栈的处理方式)。并且由于系统复位时为Thread mode,且会从0地址取SP的初始值,应将其填充为SRAM_H的高端。
接下来我们来考虑异常和中断,M0+共有7种异常,其中
IRQ为中断,像手册中提到的,我们计划用ISR处理程序来处理所有的IRQ中断,即异常向量表中IRQ0~IRQn指向的都是同一入口。再由这个中断处理入口来分析是什么中断,再去分别处理。
其他的异常中,我们只考虑PendSV和SysTick异常,因为这两异常也是M0+专门为OS设计的,我们要好好利用。用PendSV异常来处理上下文切换,类似uC/OS II在x86下的0x80软中断一样。另外我们使用SysTick异常来处理系统时钟中断,用它来做系统的tick。
由于M0+异常现场的保护工作都是由硬件完成的,会对R0~R3,R12,LR,PC,PSR压栈,所以在异常处理函数中,我们只需要将其余要使用的通用寄存器压栈即可。中断返回时也一样,将其与通用寄存器出栈后,只需要将LR的内容(EXC_RETURN)POP到PC寄存器即可完成现场恢复。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
 楼主| 发表于 2013-9-3 20:43:32 | 显示全部楼层

RE:【飞思卡尔“新”礼三重奏】 jasonwangse的方案

3.任务调度时现场的保存
由于我们的设计将OS的任务运行在Thread mode,异常和中断运行在Handler mode,Thread mode使用PSP作为栈指针,Handler mode使用MSP作为栈指针,所以在uC/OS II中OS_TCB的OSTCBStkPtr应为任务切换时PSP的值。
需要注意的一点就是M0+在进入异常时,现场保护的工作是由硬件来完成的,手册中也给出了PushStack的伪代码,同样异常返回时的现场恢复工作也是由硬件来完成的
PushStack()
if CONTROL.SPSEL == '1' && CurrentMode == Mode_Thread then
  frameptralign = SP_process;
  SP_process = (SP_process - 0x20) AND
    NOT(ZeroExtend('100',32));
  frameptr = SP_process;
else
  frameptralign = SP_main;
  SP_main = (SP_main - 0x20) AND NOT(ZeroExtend('100',32));
  frameptr = SP_main;
MemA[frameptr,4] = R[0];
MemA[frameptr+0x4,4] = R[1];
MemA[frameptr+0x8,4] = R[2];
MemA[frameptr+0xC,4] = R[3];
MemA[frameptr+0x10,4] = R[12];
MemA[frameptr+0x14,4] = LR;
MemA[frameptr+0x18,4] = ReturnAddress();
MemA[frameptr+0x1C,4] = (xPSR:frameptralign:xPSR);
所以我们在做任务切换时,除了需要将其余寄存器的值恢复到要切换的那个任务的现场外,还需要将任务切换前硬件保存的现场做相应的修改。即PSP堆栈中R0~R3,R12,LR都需要恢复成要切换的那个任务的现场,也就是说要在PendSV异常退出前,将Thread mode堆栈中存储的这些寄存器的值都替换为要切换的那个任务。
不过有一点还没考虑好,就是中断中的任务切换是直接调用切换程序去处理呢,还是也和任务中一样,通过触发PendSV异常来处理呢?我再分析分析。。。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
 楼主| 发表于 2013-9-4 16:46:00 | 显示全部楼层

RE:【飞思卡尔“新”礼三重奏】 jasonwangse的方案

已经看到第二周的名单中有我,我要继续努力了,既然能拿到开发板了,那么就一定要在真实环境下将uC/OS II跑起来。我争取总结一份移植的文档,将开发过程中的点点滴滴都记录下来,和大家一起分享~
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 10:20 , Processed in 0.092941 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表