μC/OS-Ⅱ在微处理器LH79520上的移植方案

发布者:boczsy2018最新更新时间:2018-02-12 来源: eefocus关键字:μC  OS-Ⅱ  微处理器  LH79520上  移植 手机看文章 扫描二维码
随时随地手机看文章

    随着科技的发展,嵌入式系统的应用越来越广泛,为了进行射频功率校准系统的嵌入式软件开发,需要将嵌入式实时操作系统μC/OS -Ⅱ移植到sharp lh79520微处理器上。分析了嵌入式实时操作系统μC/OS-Ⅱ的代码结构,接着,对目前流行的嵌入式微处理器sharp lh795 20的特点进行了说明,详细介绍了μC/OS-Ⅱ在sharp lh79520处理器上的移植过程,特别对OS_CPU_A.ASM文件的修改给出了详细的移植代码,最后对移植的代码进行了严格的测试,结果表明移植后的μC/OS-Ⅱ操作系统内核运行稳定可靠,验证了移植的成功。


    在嵌入式操作系统领域,Jean J.Labrosse开发的μC/OS,由于开放源代码和强大而稳定的功能,在嵌入式系统领域引起强烈反响。   μC/OS-Ⅱ开放源代码的方式使其不但知其然,还知其所以然。通过对于系统内部结构的深入了解,能更加方便地进行开发和调试;并且在这种条件下,完全可以按照设计要求进行合理的裁减、扩充、配置和移植。自1992第1版问世以来,已有成千上万的开发者把它成功地应用于各种系统,安全性和稳定性已经得到认证,现已经通过美国FAA认证。

    1 μC/OS-Ⅱ简介

    1.1 μC/OS-Ⅱ的特点

    μC/OS-Ⅱ是一个完整、可移植、可固化、可裁剪的占先式实时多任务内核。μC/OS-Ⅱ用ANSIC语言编写,包含一小部分汇编语言代码,使之可以供不同架构的微处理器使用。μC/OS-Ⅱ可以管理64个任务,具有信号量、互斥信号量、事件标志组、消息邮箱、消息队列、任务管理、时间管理和内存管理等系统功能。

    μC/OS-Ⅱ可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。μC/OS-Ⅱ操作系统内核的主要工作就是对任务进行管理和调度。从应用程序设计的角度来看,μC/OS-Ⅱ的任务就是一个线程,就是一个用来解决用户问题的C语言函数和与之相关联的一些数据结构而构成的一个实体。

    从任务的存储结构来看,μC/OS-Ⅱ的任务由3个部分构成:任务程序代码、任务堆栈和任务控制块。其中,任务控制块用来保存任务属性;任务堆栈用来保存任务工作环境;任务程序代码是任务的执行部分。

    1.2 μC/OS-Ⅱ的系统结构

    图1说明了μC/OS-Ⅱ的软硬件体系结构。

a.JPG

    应用程序处于整个系统的顶层,每个任务都可以认为自己独占了CPU,因而可以设计成为一个无限循环。μC/OS-Ⅱ处理器无关的代码,μC/OS-Ⅱ的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信以及创建、删除任务等。

    2 SHARP LH79520微处理器简介

    LH79520微处理器是夏普公司(SHARP)设计的32位ARM7TDMI RISC处理器核,具有低功耗、高性能的特点,主要功能描述如下:工作在77.414 4 MHz,带8 kHz缓存的2.5 V的静态ARM7TDMI CPU核;一个集成的SDRAM控制器和静态存储器控制器;DMA控制器;彩色LCD控制器(CLCDC);同步串行口(SSP);集成了3个通用异步收发器(UART);脉宽调制器(PWM),最高到16位的分辨率;矢量中断控制器包含了对20个内部和8个外部中断源中断请求的控制和应用;看门狗定时器Watchdog Timer;提供最多86位的可编程输入/输出口(GPIO)。

    3 μC/OS-Ⅱ的移植

    由于μC/OS-Ⅱ是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。

    基于ARM7TDMI的处理器LH79520完全满足移植的要求,本文将μC/OS-Ⅱ移植到LH79520上,使用IAR EWARM作为编译器,修改与处理器类型有关部分的代码。

    将μC/OS-Ⅱ移植到ARM处理器上,大部分的修改工作集中在3个和体系结构相关的文件中,这3个文件是OS_CPU_C.C,OS_CPU_C.h及OS_CPU_A.s,下面分别介绍这3个文件的移植过程。

    3.1 修改OS_CPU.H文件

    OS_CPU.H文件包括了用#define语句定义的、与处理器相关的常数、宏以及类型。

3.1.1 数据类型
    μC/OS-Ⅱ不使用C语言中的short,int和long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。代之以移植性强的整数数据类型,这样,既可直观又可移植,不过这就成了必须移植的代码。根据IAR EWARM C编译器的特性,特做如下定义:
    b.JPG
3.1.2 代码临界区
    RTOS在进入系统临界区前必须关闭中断,退出临界区后再开中断,μC/OS-Ⅱ定义了2个宏来开/关中断:
   c.JPG
3.1.3 堆栈增长方向
    堆栈增长方向与编译器有关,在μC/OS-Ⅱ中,用OS_STK_GROWTH来设置堆栈的增长方向,OS_STK_GROWTH为O表示堆栈从低地址向高地址方向增长;OS_STK_GROWTH为1表示堆栈从高地址向低地址方向增长,在本例中堆栈从高地址向低地址方向增长,其宏定义为:
    #define OS_STK_GROWTH 1;/*堆栈从高地址向低地址增长*/

    3.2 修改OS_CPU_C.C文件

    3.2.1 任务堆栈初始化

    修改OSTaskStkInit()函数,OSTaskStkInit()由任务创建函数OSTaskCreate()或OSTaskCreateExT()调用,用来初始化任务的堆栈。OS Task StkInit()与调用它的函数由3个参数进行传递:任务代码起始地址(task),参数指针(p_arg),任务堆栈顶地址(ptos)。

 


e.JPG

    后5个函数为钩子函数,如无特殊需求可以不加代码。
3.2.2 中断级任务切换函数
    OSINTCtxSw()函数通过设置一个全局变量OSIntCtxSwFlag标志以表示在中断服务程序中进行任务切换,并在OSTICkISR()中判断该变量以进行正确的动作。
   f.JPG
3.3 修改OS_CPU_A.ASM文件
    在此文件中需改写4个函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()和OSTickISR()。
3.3.1 OSStartHighRdy()函数
    该函数由OSStart()调用,功能是运行优先级最高的就绪任务,其代码如下:
    g.JPG
    h.JPG   

3.3.2 OSCtxSw()函数
    此函数用以实现任务级的切换,实现由低优先级任务向高优先级任务切换。此函数被任务调度函数OS_Sched()调用,实现任务切换,其代码如下:
   i.JPG
3.3.3 OSINTCtxSw()函数
    该函数的作用是在时钟中断服务例程中发现有高优先级任务等待的时钟信号到来时,则在中断退出后并不返回被中断任务,而是直接调度就绪的高优先级任务执行,这样做能够尽快地让高优先级的任务得到响应,保证系统的实时性能。
    OSIntCtxSw()函数中大部分代码同OSCtxSw()函数是一样的,区别只是,需要保存中断模式下的堆栈,在切换到用户模式下运行新任务。
3.3.4 OSTICkISR()函数
    OSTickISR()是μC/OS-Ⅱ的时钟节拍函数,主要实现任务的切换,其代码如下:
    j.JPG
    k.JPG

4 测试移植代码
    上述的移植工作是最基本的内容,除此之外,还要加上硬件初始化和相应的配置文件。
    为了验证μC/OS-Ⅱ移植成功,需要测试移植代码。首先不加任何应用代码来测试移植好的μC/OS-Ⅱ,也就是说先测试内核自身的运行情况是否良好。
    内核运行良好时,通过以下4个步骤测试移植代码的运行:
    (1)确保C编译器、汇编编译器和连接器的正常工作;
    (2)验证OSTaskStkInit()和OSStartHighRdy()函数的正确运行;
    (3)验证OSCtxSw()函数;
    (4)验证OSIntCtxSw()和OSTickIsr()函数的正确运行。
    若全部能够正常运行,那就是移植的μC/OS-Ⅱ已经能够正常的工作了,可以添加应用任务了。

    5 结语
    嵌入式实时操作系统μC/OS-Ⅱ的使用使得程序的可读性、可靠性、可扩展性有很大的改善。本文从实际出发,给出源代码开放嵌入式实时操作系统μC/OS-Ⅱ在微处理器LH79520上的移植方案,移植后的操作系统顺利经过测试,运行稳定,并达到了实时系统的要求。

关键字:μC  OS-Ⅱ  微处理器  LH79520上  移植 引用地址:μC/OS-Ⅱ在微处理器LH79520上的移植方案

上一篇:基于双CPU实时图像监控的嵌入式系统设计方法
下一篇:基于LPC2292与CAN总线的电子结算终端设计

推荐阅读最新更新时间:2024-03-16 15:54

μc/Os-Ⅱ就绪表算法在ARM架构的改动
   引  言   μc/Os-Ⅱ的就绪表设置、清除、查找算法,是高效的、跨平台的程序。它使用了两个查找数组OSMapTbl 和OSUnMapTbl ,以提高查找就绪表的速度,尽快获取就绪任务的最高优先级。   Cortex-M3是ARM公司较新的一种架构版本,主要应用在单片机领域。基于它生产的32位芯片日益增多;cortex-M3只支持THUMB-2指令集,在效能和代码密度间能取得更佳的表现。    1  在ARM上改动算法的因由利弊   由于就绪表操作是在关中断状态下运行的,其执行影响到系统的中断响应时间,因此就绪表操作算法的效率是衡量实时操作系统优劣的基准之一。   在Cortex-M3所用的指令集中,一
[嵌入式]
简单的RS232C/TTL电平转换和串口取电电路设计与制作
许多单片机的应用中都会使用到串行口与电脑的串行口相连接,进行数据的传输或控制命令的发送与接收。单片机的串口有很大一部分是使用TTL电平标准的(PIC的可以直接连接在电脑串口),它的逻辑1电平是5V,逻辑0电平是0V,而电脑串行口所使用的是RS232C的电平标准,它的逻辑1电平是-3V--12V,逻辑0电平是+3V-+12V。两者的电平范围相差很远,所以连接时需要用到电平转换电路。这样电路有好多种,一般来说商业化的成品会用到MAX232,DS275等专用的RS232、TTL电平转换集成电路,对于普通电子爱好者来说使用这样的器件一来不太好购买,二来使制作的费用提高,那用什么样的电路去代替它们呢?这也是我初初制作单片机结合电脑的应用中所
[单片机]
简单的RS232<font color='red'>C</font>/TTL电平转换和串口取电电路设计与制作
GEC210 led流水灯C语言实现 ADS工程
软件环境: ADS1.2 开发板 :GEC210 理论知识: 参考led原理介绍 因为ADS默认需要从汇编进入,所以我们的代码先调用一段短汇编,然后直接跳转到C语言 源代码如下 led.c #define GPJ2CON (*(volatile unsigned long*)0xe0200280) #define GPJ2DAT (*(volatile unsigned long*)0xe0200284) void delay(void) { int i = 0xff00000; while(i--); } //实现稍微复杂一点的功能,如流水灯操作 void main_c(void) {
[单片机]
GEC210 led流水灯<font color='red'>C</font>语言实现 ADS工程
RTEMS在S3C2440移植-(4)
有了前一篇文章的铺垫,基本上移植的工作就成功了一大半了,接下来要做的就是针对2410和2440的不同及不同开发板模块、接口的差异对2410的BSP进行修改工作。由于2410的寄存器基本吻合,所以头文件不改也没问题,这里我主要还是参考了Etual大牛的博客做了一下工作: 1.修改了时钟(PLL设置)。 libcpuarms3c24xxclocksupport.c 修改get_FCLK 由于2440 的PLL计算公式不同,在原来的基础上乘以2 就行了。修改为 return((BSP_OSC_FREQ * m * 2) / (p s)); 2.对启动代码进行修改。libbsparmsbc2440star
[单片机]
Keil软件的安装及Keil C51和Keil MDK兼容配置
最近很多学员碰到了一个keil安装的问题。 学习51单片机,用的是Keil C51版本开发,做STM32项目的时候,又要用KeIl MDK版本开发。 那如何配置,可以让C51和MDK 兼容呢? 首先我们,先了解一下 Keil C51 和Keil MDK的区别: Keil C51: 支持绝大部分8051内核的微控制器开发工具。 Keil MDK: MDK主要适用于ARM内核的单片机,支持ARM7,ARM9,Cortex-M4/M3/M1,Cortex-R0/R3/R4等,软件内的数据库包含了很多厂商的芯片。 Keil C51 和MDK是同一个公司开发的, 理论上它们不能相互兼容 。 不过, 我们无际单片机编程研究了一种方法,
[单片机]
基于C8O51FO4O的CAN总线中继器设计与实现
 0 引言   20世纪80年代初,德国BOSCH公司提出了控制器局域网(Controller Area Network,CAN)来解决汽车内部的信号传输问题。由于CAN总线优良的稳定性和实时性能、成熟的仲裁和同步技术,加上开放式总线结构、短报文高速通讯、远程通讯能力、硬件CRC超强的纠错和扩展功能,以及控制简单、应用成本低等优点,已经被越来越多地应用到分布式远程自动控制、安全监控及电力系统等网络控制系统领域,并被公认为最有前途的现场总线技术之一。   中继器是网络物理层的一种介质连接设备,可以将同一层的两段网络进行互连,也可以实现上下层不同总线的互连,起到网桥和网关的作用。在大中型远程的CAN总线系统中经常会使用到中继器,主
[单片机]
基于<font color='red'>C</font>8O51FO4O的CAN总线中继器设计与实现
C51---14 LCD
LCD介绍 本文选择LCD1602液晶屏 引脚以及应用电路 内部结构框图 存储器结构 时序结构 LCD1602指令集 LCD1602操作流程 字符、字符串 LCD液晶显示 在LCD上显示字符 字符串 二进制 十进制 十六进制数字 main函数 #include REGX52.H #include LCD1602.h #include Delay.h void main() { LCD_Init(); //LCD初始化 LCD_ShowChar(1,1,'A'); //在1行1列显示字符A LCD_ShowString(1,3, Hello );
[单片机]
<font color='red'>C</font>51---14 LCD
STM32的硬件I2C设计有BUG
坊间一直流传着一个传说~STM32的硬件I2C设计有BUG,最好不要用,用软件I2C比较靠谱。长久以来,为了不必要的麻烦,我也一直没有用过硬件I2C,主要是软件I2C也比较方便,基本上任意端口都可以用。 最近画了块板子,正好用到了I2C,就顺便来测试一下硬件I2C是不是真的像有些人说的不好用。 测试硬件:STM32F407VET6+AT24C64测试软件:STM32CubeMX v6.1.1HAL库:STM32CubeF4 Firmware Package V1.25.2 STM32CubeMX配置 使用STM32CubeMX配置很方便,时钟等基础配置不再详细介绍,直接看I2C配置如下: 这里的速度模式选择为标准模式,
[单片机]
STM32的硬件I2<font color='red'>C</font>设计有BUG
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved