新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 使用凌阳SPCE061A的嵌入式应用系统设计

使用凌阳SPCE061A的嵌入式应用系统设计

作者:时间:2011-05-05来源:网络收藏

  μC/OS-II 在上的移植

  μC/OS-II内核移植的主要内容

  μC/OS-II是为微控制器和应用软件开发而的抢占式实时多任务操作系统,其内核主要实现任务调度、任务间的通信、内存管理和时间管理。其软件体系结构以及与硬件的关系如图3所示.
多任务应用程序位于最上层,通过调用内核的API函数来实现任务的调度和切换、存储管理和任务进程的通讯. μC/OS-II的大部分代码是用C语言编写,而与硬件相关的三个源程序文件0S_CPU.H,OS_CPU_A.A,OS_CPU_C.C含有与硬件处理器相关的汇编语言代码,来实现对处理器寄存器的访问以及堆栈的操作.因而μC/OS-II操作系统在上的移植主要是对0S_CPU. H,OS_CPU_A.A,OS_CPU_C.C三个源程序的编写。

  其中OS_CPU.H 中包括了用#define定义的与处理器相关的常量,宏和类型定义.这样与μC/OS-II所定义的变量类型相一致.OS_CPU_A.A 中要求用户编写四个简单的汇编函数:(1)OSStartHighRdy()函数的作用是用于运行最高优先级的就绪任务.(2)OSCtxSw()是实现 CPU 在正常运行时任务间的切换,即对当前任务堆栈的保存和对高优先级任务堆栈的弹出,使最高优先级任务获取CPU 的控制权. (3)OSIntCtxSw()是在中断服务程序中执行任务切换功能的函数.(4)OSTickISR()是系统时钟的中断服务程序.该程序执行频率为10~100 Hz,主要功能是检查是否有由于延时而被挂起的任务成为就绪任务,如果有就调用OSIntCtxSw()进行任务切换,从而运行高优先级的任务. OS_CPU_C.C中主要是编写任务堆栈初始化函数OSTaskStklnit().

  移植中的关键问题

  多任务系统在运行时,任一当前正在运行的任务好像独占CPU一样,需要为每个任务开辟一段内存空间作为该任务的任务堆栈,该堆栈的作用是保存任务被切换前时CPU各寄存器的值以及系统堆栈的数据。由于不同的处理器其内部的寄存器分配不一样,有时堆栈的增长方式也不一样,因而移植的关键问题就是要针对不同的处理器如何在任务切换时做好寄存器的状态的保护,以及系统堆栈和任务堆栈的切换,从而编写好介于底层硬件和操作系统之间的软件层。 单片机有R1~R5五个通用寄存器,以及段寄存器SR, 程序计数器PC,共有7个CPU内部寄存器在任务切换前需要保存。μC/OS-II系统通过调用OSCtxSw()来实现任务的切换。

  语音识别系统实例

  本系统通过一个语音识别系统来验证μC/OS-II在SPCE061A上的移植成功,系统共创建4个实时任务,硬件实现上只需在最小系统上增加相应的音频电路和液晶显示模块。

  //建语音识别初始化任务

  OSTaskCreate(Task1, (void * )0, (void*) tackl[-TASK—STK—SIZE一1],1);

  //建立语音训练任务

  OSTaskCreate(Task2, (void * )0, (void*) tack2[-TASK—STK—SIZE一1],2);

  //建立语音识别任务

  OSTaskCreate(Task3, (void * )0, (void*) tack3[-TASK—STK—SIZE一1],3);

  //LCD显示的任务

  OSTaskCreate(Task4, (void * )1, (void*) tack4[-TASK—STK—SIZE一1],4);

  同时采用信号量来实现语音识别任务和LCD显示的任务之间的通讯,使得系统在成功识别语音后同时控制LCD输出识别的正确与否的信息。系统运行结果:系统初始化,调用训练函数进行语音识别训练;训练成功后,进入语音识别循环,并将语音识别的结果在LCD上显示出来。

  μC/OS-II操作系统具有较强的实时性,而且代码量较小(总计8K 多),现已被移植到许多处理器上。而将μC/OS-II移植到SPCE061A芯片上,具有一定的应用价值,使得基于SPCE061A的可以更加灵活。同时μC/OS-II 实时操作系统的在SPCE061A移植,不但可以提高基于SPCE061A的的实时性、可靠性和稳定性,还提高了应用软件的可移植性,降低了研发周期。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭