Keil MDK 下 uC/OS-II 在LPC11C14上的移植

发布者:salahc1983最新更新时间:2019-05-07 来源: eefocus关键字:Keil  MDK  OS-II  LPC11C14  移植 手机看文章 扫描二维码
随时随地手机看文章

uCOS-II 在 ARM上的移植很常见,而在 KEIL MDK 下的移植却不是很多,根据 ARM 下的移植范例,结合自己最近使用 KEIL MDK 的稍许心得,记录一下 uCOS-II 在 KEIL MDK 下的移植过程。在移植过程中也参考了他人的资料如有部分雷同请谅解,本文仅也供个人参考,共同学习。

uCOS II是一个源码公开、可移植、可固化、可剪裁和抢占式的实时多任务操作系统。

移植:就是使得一个实时内核,或者应用的代码在某个微处理器或微控制器平台上运行。

一:准备源码

1、在官网上下载了 uCOS-II 的源码,好像是 2..91 的了.
        官网下载地址:http://www.micrium.com
        NXP相关下载地址:http://micrium.com/downloadcenter/download-results/?searchterm=hm-nxp&supported=true
        各模块下载网址:http://micrium.com/downloadcenter/

2、开发平台:Keil MDK for arm 4.12

3、CPU有关的源码

4、和厂商有关的

二、解压uCOS-II的源码

解压官网上下载的源码 Micrium-uCOS-II-V290.zip。里面的源码主要有如图:

三、硬件平台要求

1. 处理器的C编译器能产生可重入代码。

2. 用C 语言就可以打开和关闭中断。

3. 处理器支持中断,并且能产生定时中断(通常在10 至100Hz 之间)。

4. 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。

5. 处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。

四、移植主要工作

1、用#define 设置一个常量的值(OS_CPU.H)

2、声明10 个数据类型(OS_CPU.H)

3、用#define 声明三个宏(OS_CPU.H)

4、用C 语言编写六个简单的函(OS_CPU_C.C)

5、编写四个汇编语言函数(OS_CPU_A.ASM)

根据处理器的不同,一个移植实例可能需要编写或改写50 至300 行的代码,需要的时间从几个小时到一星期不等。

五、创建一个工程

1、使用Keil MDK 创建工程

2、选择芯片型号

3、选择”OK” 自动创建startup_LPC11xx.s文件

这时我们要修改自动创建的startup_LPC11xx.s文件。因为.s里的头文件里的中断函数和uCOS-II里os_cpu.h的定义的不相同。所以进行修改。

下图就是OS_CPU.H的中断函数的定义。

修改startup_LPC11xx.s如下:

经过查找是系统的任务切换函数的原因,这个文件是keil自动生成的,里面的中断向量分配的地址的函数名是SysTick_Handler,而ucos的名称是OS_CPU_PendSVHandler,函数的代码是在.asm里面,所以我们需要加上“IMPORT OS_CPU_PendSVHandler”让系统在其他文件寻找。我们将DCD PendSV_Handler改为DCD OS_CPU_PendSVHandler 修改完后发现,系统不但能进入创建的任务,也是按照我们设置的优先级顺序执行的,但是我们建立的任务都只执行了一次(应该说调用了OSTimeDly)就再没有返回来执行。

进一步查找发现我们还没有对操作系统的时钟初始化,我在系统建立的第一个任务中初始化系统时钟OS_CPU_SysTickInit (INT32U cnts),这个函数在os_cpu_c.c文件里面。和上面一样我们将DCD SysTick_Handler改为DCD OS_CPU_SysTickHandler,同样需要加上“IMPORT OS_CPU_SysTickHandler”。OS_CPU_SysTickInit会调用OS_CPU_SysTickHandler中断,在初始化时我们需要注意OS_CPU_SysTickInit的参数,他决定了系统的时钟节拍是多少如果太小操作系统一样不能正常工作,系统建议的时钟节拍是10ms到100ms,我设置的是1ms,OS_CPU_SysTickInit的代码如下所示。

void OS_CPU_SysTickInit (INT32U cnts)
        {
                INT32U prio;

                OS_CPU_CM0_NVIC_ST_RELOAD = cnts - 1u;

                prio = OS_CPU_CM0_NVIC_PRIO_ST;
                prio &= ~(OS_CPU_CM0_NVIC_PRIO_MIN);
                prio |= OS_CPU_CM0_NVIC_PRIO_MIN;
                /* Set prio of SysTick handler to min prio. */
                OS_CPU_CM0_NVIC_PRIO_ST = prio;
                /* Enable timer. */
                OS_CPU_CM0_NVIC_ST_CTRL |= OS_CPU_CM0_NVIC_ST_CTRL_CLK_SRC | OS_CPU_CM0_NVIC_ST_CTRL_ENABLE;
                /* Enable timer interrupt. */
                OS_CPU_CM0_NVIC_ST_CTRL |= OS_CPU_CM0_NVIC_ST_CTRL_INTEN;
        }

4、修改Micrium-uCOS-II-V290MicriumSoftwareuCOS-IISource的os_cfg_f.h为os_cfg.h。因为在其他.c里面要调用os_cfg.h头文件。

5、添加CPU相关代码

我从官网上下载的源码,是STM32的因为没有LPC11C14相关的资料。

因此就想借用以下试试看可以用否。结果好像可以(忒高兴)。

路径:Micrium_STM320518-EVAL_uCOS-IIMicrium_STM320518-EVAL_uCOS-IIMicriumSoftwareuCOS-IIPortsARM-Cortex-M0GenericRealView

6、删除ucos_ii.c

因为重复定义头文件。

7、工程目录

8、头文件的路径配置

9、编译

附件:

1、IMPORT的运用

IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。

语法格式:

IMPORT symbol{[WEAK]}

其中,symbol为声明的符号的名称。它是区分大小写的。

[WEAK]指定这个选项后,如果symbol在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。

使用说明:

使用IMPORT伪操作声明一个符号是在其他源文件中的定义。如果连接器在连接处理时不能解析该符号,而IMPORT伪操作中没有指定[WEAK]选项,则连接器将会报告错误。如果连接器在连接处理时不能解析该符号,而IMPORT伪操作中指定了[WEAK]选项,则连接器将不会报告错误,而是及进行下面的操作: 如果该符号被B或者BL指令引用,则该符号被设置成下一条指令的地址,该B或者BL指令相当于一条NOP指令

其他情况下该符号被设置为0

2、修改os_cpu_a.asm文件

根据我们移植的源码情况来修改os_cpu_a.asm文件,如果我们用的是MDK 软件,并且.S源码还是PUBLIC的话就进行相应的改写。

因为我们使用的是keil,所以需要建里面的public改为EXPORT如下图所示。

另外还有段代码需要修改,否则编译不过。

IAR汇编: 
        RSEG CODE:CODE:NOROOT(2)
                THUMB
        Keil汇编:(这段不知)
                AREA |.text|, CODE, READONLY, ALIGN=2
                THUMB
                REQUIRE8
                PRESERVE8

修改完以上内容编译并下载进目标板,发现操作系统的函数都执行了,但是始终不能进入我们自己创建的任务。

3、始终不能进入我们的任务

我就出现这种情况,经调试现象是OSInit()、OSStart()、 OSTaskCreateExt()都已经执行。唯独就是第一个任务Task_Start()进不去。错误原因:

startup_LPC11xx.s的两个中断函数和uCOS-II的内核的中断函数定义的不相同。也就是uCOS-II自己定义的有相关中断,我们要用到uCOS-II的内核的中断函数。

修改如下:


关键字:Keil  MDK  OS-II  LPC11C14  移植 引用地址:Keil MDK 下 uC/OS-II 在LPC11C14上的移植

上一篇:ARM Cortex-M3的startup.s文件详解
下一篇:LPC17XX 学习之 uCOS-II 移植实例

推荐阅读最新更新时间:2024-11-06 14:04

电压控不可取 电流控UC3842入围理想电源
由电压控制的开关电源会对电流失控,不利于过流保护,响应慢、稳定性差等缺点都是显而易见的。相比来说,用电流来控制开关电源是一个电压、电流双闭环控制系统,克服了电流失控的缺点,性能可靠、电路简单。因此,我们用 UC3842 芯片设计一个电流控制型开关电源,提高了输出电压精度,系统并未采用离线式结构,而是采用直接反馈结构。本系统在设计上充分考虑了电磁兼容和安全的因素,广泛应用在工业、家电、视听和照明设备。 电流控制型开关电源的原理框图 电流型控制是针对电压型控制的缺点而发展起来的,在保留了电压控制型的输出电压反馈控制部分外,又增加了一个电流反馈环节,其原理框如图1所示。 图1 电流控制型开关电源的原理框图 电流控制型开关电源是一个电
[电源管理]
电压控不可取 电流控<font color='red'>UC</font>3842入围理想电源
cramfs根文件系统的移植成功(fs2410下亲测)
1 引言 依据Unix的习惯,通常会将linux系统中任何对象(包括设备)都视为文件。而根文系统是所有文件和设备节点的起始点,它是决定系统能否正常启动的关键所在。本文将详细介绍利用Busybox工具集制作一种简单的根文件系统即Cramfs根文件系统的方法。 2 开发平台简介 开发系统采用主机+目标板的开发模式,目标板和主机通过串行线和Ethernet网线实现通信。主机采用的是:pc机+VMware6.0虚拟机下的Red Hat 9 目标板:深圳优龙公司开发的FS2410实验开发板:其主要参数:CPU:三星S3C2410,主频203MHz;内存:64M 字节;NOR Flash:2M 字节(SST39VF1601)
[单片机]
cramfs根文件系统的<font color='red'>移植</font>成功(fs2410下亲测)
TinyOS在MSP430F2618上移植(三)之LCD
本节记录串口TFT LCD在TinyOS上的移植。1.8寸LCD显示屏采用ST7735控制器,使用SPI接口实现控制、显示数据的传输。 总体架构:分为3层结构,最底层位于相应的platforms中chips目录下,实现在特定平台上控制引脚连接,SPI接口连接,以及SPI配置。中间层实现了LCD基本操作,LCD初始化,提供给上层模块连接的接口,以及资源管理。最上层提供应用层模块连接的接口。 在本架构中,中间层和最高层提供相同的接口LCD16,该接口提供的实现方法有english_string,clear,single_color等,以及写完成事件writeDone。不同的是在最高层提供的接口LCD16中,并没有真正实现接口
[单片机]
Linux移植之auto.conf、autoconf.h、Mach-types.h的生成过程简析
在Linux移植之make uImage编译过程分析中分析了uImage文件产生的过程,在uImage产生的过程中,顺带还产生了其它的一些中间文件。这里主要介绍几个比较关键的文件 1、linux-2.6.22.6includeconfigauto.conf、inux-2.6.22.6includelinuxautoconf.h文件的生成过程 2、includeasm-armMach-types.h文件的生成过程 1、inux-2.6.22.6includeconfigauto.conf、inux-2.6.22.6includelinuxautoconf.h文件的生成过程 在顶层Makefile中尝试寻找auto.c
[单片机]
STM32-Keil软件仿真和硬件仿真/在线仿真
软件仿真和硬件仿真什么区别?软件仿真就是没有硬件参与的仿真,完全是模拟实现的。硬件仿真是将程序下载到控制芯片的FLASH或RAM中,直接在硬件上实现仿真。【有什么问题欢迎联系讨论,一起解决问题】 仿真这种东西,因为涉及到信任问题,用的好觉得好用,用不好可能会徒增麻烦——“还不如直接在硬件上调试靠谱”。但是总体上,仿真还是比较有用的,比如在排查软件问题(寄存器配置等)的时候,使用软件仿真是非常靠谱的。而如果涉及到硬件的问题(比如你的板子代码需要读取外部信号,或者输出信号等),可能需要用到硬件仿真,或者说在线仿真。关于仿真,网上的资料说的还是挺全的,这里只做总结。 一、软件仿真 1.1 仿真配置 首先确定仿真的硬件环境。点击魔
[单片机]
STM32-<font color='red'>Keil</font>软件仿真和硬件仿真/在线仿真
S3C2416裸机开发系列十五_GCC下uCOS的移植(1)
操作系统是用来管理系统硬件、软件及数据资源,控制程序运行,并为其它应用软件提供支持的一种系统软件。根据不同的种类,又可分为实时操作系统、桌面操作系统、服务器操作系统等。对于一些小型的应用,对系统实时性要求高,硬件资源有限等的情况下,应尽量避免使用复杂庞大的操作系统(如Linux),使用小型的实时操作系统(如uCOS)更能满足应用的需求。笔者此处就uCOS-II的移植作一个简单的介绍。 1. 代码准备 uCOS-II V2.91源码,这个版本的源码是uCOS-II的最新版本,请读者自行从Micrium官网或其它网站下载这个版本的源码,当然,其它版本的uCOS-II也是一样方式移植的。Micrium官网也给出了一些cpu的移植范例,
[单片机]
STM32 SRAM启动的 KeiL 配置
BOOT 引脚改成从SRAM 启动,即 BOOT0=1,BOOT1=1 如果使用ST提供的库函数 3.5 打开(system_stm32f10x.c) #define VECT_TAB_SRAM 2.x 可以通过调用以下两个函数切换中断向量表的指向。 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00); NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); KEIL 的配置 (SYM32F103C8T6 (64kFlash/20kSram);
[单片机]
STM32 SRAM启动的 <font color='red'>KeiL</font> 配置
基于μC/OS-II的嵌入式激光测距系统方案
0 引言 激光测距系统的最基本原理就是测量激光脉冲在空间传播的时间间隔,从而获得被测量的距离。针对相位法激光测距的基本原理与实现方法进行研究,本文结合了嵌入式、差频测相等相关技术和实时操作系统μC/OS-II的优点,硬件结构合理,软件实现方法灵活,满足了网络化实时高速信息提取和传输的要求。 避免了传统测距系统中存在着劳动强度大、数据采集慢、数据处理时间长、计算准确度低及数据不能直接输出到其它系统等问题。本系统实现相对简单,具有测量精度高、稳定度好、速度快等优点。在生产厂矿、科研学校、计量院所等有着很大的应用空间,具有有很高的实用价值。 1 系统的基本原理 1.1 相位式激光测距原理 对于连续波的激光测距一般采用
[单片机]
基于μC/<font color='red'>OS-II</font>的嵌入式激光测距系统方案
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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