ucOS学习笔记(4)——一步一步移植ucOS到STM32

发布者:WhisperingLight最新更新时间:2016-07-14 来源: eefocus关键字:ucOS  移植  STM32 手机看文章 扫描二维码
随时随地手机看文章
准备工作:
1.到micrium官网下载最新的 OS在stm32上的移植资料。下载地址为:http://micrium.com/download/Micrium-ARM-OS-II-Cortex-M3.exe

2.平台搭建:
a.将1下载得到的文件解压得到micrium文件夹,并在Micrium\Software\ OS-II下用UV4创建一个 OS工程,配置CPU为STM32F101C8

b.建立如图1所示的工程目录结构。其中APP层用于放置应用程序, OS用于放置所有 OS与处理器无关的源码,PORT用于放置移植 OS需要改动的文件,而BSP则用于放置系统的驱动程序,LIB为系统调用的库支持。该目录组织依据来源于micrium公布的 OS移植文档,图2是该移植文档的系统软件结构图供参考。
 
ucOS学习笔记(4)——一步一步移植ucOS到STM32(转) - 我心永恒 - ARM-实践者
 
图1 OS的目录结构
ucOS学习笔记(4)——一步一步移植ucOS到STM32(转) - 我心永恒 - ARM-实践者
 
图2 OS系统软件结构
c.工程建立完毕以后将Micrium\Software\ OS-II\Source目录下的所有文件(包括h文件)添加到 OS组,将Micrium\Software\ OS-II\Ports\ARM-Cortex-M3\Generic\RealView目录下的所有文件添加到PORT组

d.完成以上工作后进行一次编译,我们可以发现出现错误提示
 .Source\os_core.c(26): error:  #5: cannot open source input file " os_ii.h": No s h file or directory
该问题是包含文件路径引起的, os_ii.h文件实际上存在于Micrium\Software\ OS-II\Source目录下。因此我们需要在工程设置中的C/C++选项卡手动增加头文件路径,针对以上错误我们应该增加的头文件路径未.\Source

e.再次编译发生错误
.\Source\ os_ii.h(44): error:  #5: cannot open source input file "app_cfg.h": No s h file or directory
这个问题应该不是原生 OS导致的,是micrium移植系统的时候修改了源文件,在其中增加了一些配置选项,这个配置选项保存在app_cfg.h中,但是micrium发布移植文件包的时候该文件又没有包含在内,因此需要我们自己写一个配置文件。本文为了方便就不细致研究文件内容,直接从micrium的开发板STM3210B-EVAL源码包中拷贝该文件放置于工程目录下的APP文件夹中,并设置相应的包含路径。

f.再次编译发生错误
.\Source\ os_ii.h(45): error:  #5: cannot open source input file "os_cfg.h": No s h file or directory
在micrium的移植文件包中也没有这个文件,但是在目录Micrium\Software\ OS-II\Source下存在一个文件名为os_cfg_r.h的文件,将该文件名后的r去掉解决。

g.再次编译发生错误
.\Source\ os_ii.h(46): error:  #5: cannot open source input file "os_cpu.h": No s h file or directory
该文件实际上存在于Micrium\Software\ OS-II\Ports\ARM-Cortex-M3\Generic\RealView目录下,因此可以通过修改文件包含路径解决。

h.再次编译发生错误
.\OUTPUT\ OSII.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
点击该错误提示出现以下内容:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00002800  {  ; RW data
   .ANY (+RW +ZI)
  }
}
实际上这个错误发生在连接阶段,从点击错误得到的信息看表示连接的时候找不到一个标号为RESET的段,而keil默认连接是从RESET段开始的,因此出现了这个错误。对于这个错误的解决方法我们可以通过e的方式,将开发板软件包内的init.s文件拷贝到APP目录,并添加到工程中,同时把init.s文件中第一个段改名由INIT为RESET解决。

i.再次编译发现在连接的时候很多以hook结尾的代码找不到实体,但是有声明。错误示例如下:
.\OUTPUT\ OSII.axf: Error: L6218E: Undefined symbol App_TCBInitHook (referred from os_cpu_c.o).
这些函数实际上都是 OS为了方便用户监视系统运行过程而保留的钩子函数, OS内部的函数名实际上是OSTCBInitHook,micrium在移植过程中为了层次清晰,在 OS钩子函数内部增加了相应的APP***HOOK调用,同时通过功能开关OS_APP_HOOKS_EN来控制是否启用这些功能。我们当前的代码除了 OS系统代码,其他什么应用代码都还没有,因此编译会出错。这种情况下我们需要暂时关闭这个功能将在OS_CFG.h中的OS_APP_HOOKS_EN配置为0。

j.再次编译发现系统提示没有main函数,增加一个main.c文件解决。

k.再次编译发生错误:
.\OUTPUT\ OSII.axf: Error: L6218E: Undefined symbol OS_CPU_SysTickClkFreq (referred from os_cpu_c.o).
这个错误时系统找不到OS_CPU_SysTickClkFreq这个函数实体。查阅相关资料发现micrium增加这个函数的目的是获取系统当前的时钟频率,于是我们在工程中的BSP组增加一个bsp.c文件,同时实现这个OS_CPU_SysTickClkFreq函数即可。未测试需要,本函数简单写为
INT32U     OS_CPU_SysTickClkFreq(void)
{
  return 8000000;
}

l.再次编译已经没有错误发生,只有一个警告信息
.\OUTPUT\ OSII.axf: Warning: L6305W: Image does not have an entry point. (Not specified or not set d to multiple choices.)
通过查阅资料,大致意思就是说keil不知道整个代码的入口在哪儿,根据init.s中的代码
ENTRY
ResetHndlr      

;******************************************************************************
;                              SETUP STACK POINTERS
;******************************************************************************
                

;******************************************************************************
;                                   MOVE TO MAIN
;******************************************************************************
                ldr     r0, =__main
                bx      r0                                     ; Save this in register for possible long jump              ;

                ALIGN
                END 
可以看到我们的入口在标号为ResetHndlr的地方,因此我们通过指定入口解决该问题。指定入口的方法是在编译器选项的linker页增加命令
--entry ResetHndlr

至此第一步编译算是完成了。

关键字:ucOS  移植  STM32 引用地址:ucOS学习笔记(4)——一步一步移植ucOS到STM32

上一篇:ucOS学习笔记(5)——一步一步移植ucOS到STM32
下一篇:ucOS学习笔记(3)——ucOS的数据结构

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

STM32调试-串口打印函数及使用方法
1.在usart.h文件里,添加以下代码: #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1- SR&0X40)==0);//循环发送,直到发送完毕 USART1- DR = (u8) ch;
[单片机]
STM32 AD7792驱动调试总结
调了好久,终于通了。。为什么用了一周时间这么久?主要原因是我不知道隔离模块有问题,导致一直是盲目的改代码,今天没办法,直接把隔离模块短路,一下子就读出了ID号。 7792挂在SPI2上,PB12,PB13,PB14,PB15,可我用SPI调的时候一直读出来是0XFF,以为是SPI2有问题,于是我直接抛弃SPI,用时序直接读。很好用!!! 下面是我的代码: #define SCLOCK1 GPIO_SetBits(GPIOB,GPIO_Pin_13); #define SCLOCK0 GPIO_ResetBits(GPIOB,GPIO_Pin_13); #define CS1 GPIO_SetBits(GPIOB,G
[单片机]
Exynos4412 内核移植(五)—— 驱动的移植
以移植自己制作的驱动,学习内核移植中的驱动移植,及 驱动程序的动态编译和静态编译 硬件环境: Linux 内核版本:Linux 3.14 主机:Ubuntu 12.04发行版 目标机:FS4412平台 交叉编译工具:arm-none-linux-gnueabi-gcc 一、静态编译 1、添加驱动文件 将写好的实验代码fs4412_led_drv.c 拷贝到 drivers/char 下 fs4412_led_drv.c 如下: #include linux/kernel.h #include linux/module.h #include linux/fs.h #include linux
[单片机]
Exynos4412 内核<font color='red'>移植</font>(五)—— 驱动的<font color='red'>移植</font>
STM32串口IAP实验笔记
STM32的IAP功能确实方便,以前对此如何实现有所了解,但是一直没去测试,这两天来练了下,可谓困难重重,搞了两天问题也一一解决,下面做些简要的笔记 IAP就是在线应用编程,方便程序升级,可以不用打开产品,直接通过串口升级,那么就需要一个引导程序(大神们喜欢称bootload),一个APP程序(实际产品的工作程序) 减小测试难度,我设计了3个程序,一个bootload程序,一个LED闪烁程序,一个KEY+LED点动程序,我的目的就是用两个不一样的APP程序,互相升级,方便验证结果 我手里的开发板是STM32F103ZET,属于大容量产品,flash有512K, 我们的bootload和APP应用程序就需要在flash里面进行划分,
[单片机]
<font color='red'>STM32</font>串口IAP实验笔记
STM32之CAN ---CAN ID过滤器分析
1 前言 在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。 为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。 为了让大家了解STM32的bxCAN的接收过滤机制,首先大
[单片机]
<font color='red'>STM32</font>之CAN ---CAN ID过滤器分析
3D打印肝脏“补丁”可延长移植患者寿命一两年
  在短短三年内,等待肝移植的患者可能能够捐赠健康细胞,并将它们通过 3D打印 机复制成可以延长其寿命的美元大小的组织。下面就随医疗电子小编一起来了解一下相关内容吧。 3D打印肝脏“补丁”可延长移植患者寿命一两年   位于圣地亚哥的生物打印公司Organovo已经表明,其 3D打印 的肝组织贴片在植入小鼠时继续发挥作用。那么下一步的研究将是人类。   据悉,这家开发生物打印过程的公司有着10年的历史,可以定制生产多种形式的组织,包括微型人体肝组织和肾组织。   Organovo的 3D打印 组织已被用于加速临床前药物测试。传统的测试和开发使用动物或放置在培养皿中的小细胞样品,平均花费12亿美元,需要十几年的时间。成本很高,部
[医疗电子]
STM32外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序
本篇介绍STM32如何外接温湿度传感器实现当前环境温湿度的读取,并显示到OLED屏幕上。 1 DTH11温湿度传感器 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,包括一个电阻式感湿元件和一个NTC测温元件。 1.1 数据读取协议 微控制器MCU与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右。 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。 从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT1
[单片机]
<font color='red'>STM32</font>外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序
RyanMqtt移植指南
测试环境:stm32F401RCT6、RT-Thread版本: v4.1.0、RT-Thread Studio版本: 2.2.6、网络硬件使用ec800m移植at_socket使用sal框架。 1、移植介绍 RyanMqtt 库希望应用程序为以下接口提供实现: system 接口 RyanMqtt 需要 RTOS 支持,必须实现如下接口才可以保证 mqtt 客户端的正常运行 network 接口 RyanMqtt 依赖于底层传输接口 API,必须实现该接口 API 才能在网络上发送和接收数据包 MQTT 协议要求基础传输层能够提供有序的、可靠的、双向传输(从客户端到服务端 和从服务端到客户端)的字节流 time 接口
[单片机]
RyanMqtt<font color='red'>移植</font>指南
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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