STM32固件库3.5+uCOS2.86移植(转自暴走的工程师)
考了很多移植的资料和代码,终于移植好了。。。应该是完美移植吧~~哈哈哈~~
编译环境是IAR
工程适用于STM32F10X大容量产品,如果不是,请自行修改启动文件和工程配置
编译器优化等级最高。。。这个你们根据需要自己调整吧。。。
###############################################################################
1.Jean J.Labrosse与μCOS—II
μCOS—II是一个实时可剥夺型操作系统内核,该操作系统支持最多64个任务,但每个任务的优先级必须互不相同,优先级号小的任务比优先级号大的任务具
有更高的优先级,并且该操作系统总是调度优先级最高的就绪态任务运行。此内核的代码是美国人Jean
J.Labrosse用C语言编写的(花了一年时间),具有很好的可移植性,其2.52版本通过了美国航天航空管理局的安全认证,可靠性非常高。
2.准备工作
去micrium(uscos官网)和arm指令官网(为了汇编)找相应的appNote和源码
STM32F103ZE AN1913
arm指令。。随便给的,再找一找具体的
先把固件库先建立好。
下面进行移植。首先去官网下载ucos的最新版本2.86源码。还有2.86的keil的工程以及2.92IAR的工程(不知道为虾米,就是木有2.92的源码下载。。。)
把源码解压,在工程的根目录下新建文件夹uCOS_II,再在这个文件夹里面再新建两个文件夹Source和Ports
在Source文件夹里面放入如下文件
在工程里面把文件包含进去并设置好。
编译,肯定会出错。
提示:.\uCOS_II\Source\ucos_ii.h(44):
error:
input file "app_cfg.h": No such file or directory
把2.86工程里面的app_cfg.h复制并放到APP文件夹下。再编译
评论:app_cfg.h只是一些配置文件,可以根据自己的需要剪裁
提示:.\uCOS_II\Source\ucos_ii.h(45):
error: #5: cannot open source
input file "os_cfg.h": No such file or directory
把2.90源码里的os_cfg_r.h改名为os_cfg.h以及os_dbg_r.c改名为os_dbg.c后放入APP文件夹下。再编译
评论:os_cfg.h
和os_dbg.h也可以在\Micrium\Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD找到
提示:.\uCOS_II\Source\ucos_ii.h(46):
error: #5: cannot open source
input file "os_cpu.h": No such file or directory
把2.92工程里的os_cpu.h和os_cpu.c,以及2.86工程的os_cpu_a.asm复制到ports文件夹下。(注意2.90版本新增的一个钩子函数)编译
评论:没遇到此类问题
把os_cfg.h里的OS_APP_HOOKS_EN设置为0。编译
无错误。
#################################################
注意:以下是2.90新增的钩子函数,如报错,请在os_cpu.c增加以下代码
########################################
但是还有很多事情要做。。。(以上仅供参考~)
新建文件夹BSP。用于放驱动层与应用层之间的BSP文件。
把2.86工程里面才bsp.c和bsp.h放进去,并进行适当的修改(自己斟酌。。。)。唯一要注意的是需要保留OS_CPU_SysTickClkFreq这个函数。
评论:以上这段要适量剪裁,其实OS_CPU_SysTickClkFreq在初始阶段没有编译哦,加不加无所谓
使用st V3.5.0 库中的startup_stm32f10x_hd.s 作为启动代码
需要修改的地方:
用OS_CPU_PendSVHandler 替换startup_stm32f10x_hd.s
中所有的PendSV_Handler
用OS_CPU_SysTickHandler 替换startup_stm32f10x_hd.s
中所有的SysTick_Handler
评论:st
v3.5.0的确实要替换这两个鬼东东,但是如果你用Micrium\Software\EvalBoards\ST\STM32-SK\IAR\OS-Probe-LCD\app_vect_v5.c
这个C程序的启动文件 完全不用更改
void uart_init(void)
{
u32 baudRate = ;//波特率
float temp;
u16 BRR_Value;
u16 BRR_Mantissa;
u16 BRR_Fraction; //定义时钟选择结构体
RCC_ClocksTypeDef RCC_ClocksStatus; RCC_GetClocksFreq(&RCC_ClocksStatus);
//选择PCLK2 为时钟 RCC设置里未分频,即72Mhz
temp = (float)(RCC_ClocksStatus.PCLK2_Frequency)/(baudRate*); BRR_Mantissa = (u32)temp; //得到BRR[15:4]整数部分 BRR_Fraction = (u32)(temp - BRR_Mantissa)*; //得到BRR[3:0]小数部分 BRR_Mantissa<<=; BRR_Value = BRR_Mantissa + BRR_Fraction; //拼接整数和小数部分 USART1->BRR = BRR_Value; //设置波特比率 USART1->CR1 |= <<; // Enable the USART by writing the UE bit in USART_CR1 register to 1 USART1->CR1 |= <<; // Set the TE bit in USART_CR1 to send an idle frame as first transmission USART1->CR1 |= <<; // Set the RE bit USART_CR1. This enables the receiver which begins searching for a start bit. }
//我这个用库了。。不用库也一样。。没找到不用库的版本
void USART1_Puts(char * str)
{
//USART_ClearFlag(USART1,USART_FLAG_TC); 清零TC用的,网上说法:“清除标志位,否则第1位数据会丢失”
while(*str)
{
GPIO_ResetBits(GPIOF, GPIO_Pin_8);
USART_SendData(USART1, *str++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
GPIO_SetBits(GPIOF, GPIO_Pin_8);
}
} 主程序来一下~
int main (void)
{
OSInit(); OSTaskCreateExt(AppStartTask,
(void *),
(OS_STK *)&AppStartTaskStk[TASK_STK_SIZE-],
TASK_START_PRIO,
TASK_START_PRIO,
(OS_STK *)&AppStartTaskStk[],
TASK_STK_SIZE,
(void *),
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSStart();
}
再来个task任务~别忘了声明啊static void AppStartTask (void *p_arg); static void AppStartTask (void *p_arg)
{
(void)p_arg; USART1_Puts("aaaaa!\r\n"); while() {
delay();
}
}
下面就简单讲下ucos移植时各个文件的要点。
首先是source文件夹里面的源码,是用C写好的系统源码,这个不需要我们改,包括以下文件。
然后是Ports文件夹里面的,这个是与硬件平台有关的代码,有一部分用汇编写成。本来这一部分的编写是需要我们自己来的,但是既然官网都给我们了,不用是傻13。。。主要有以下文件:
a:os_cpu.h主要声明了与微处理器无关的常量、宏和声明。ucos为了可移植性,用INT32U代替了unsigned
int等等之类的,就是在此声明的。
B:os_cpu.c里的是与CPU相关的C函数和钩子函数。里面真正需要我们写的只有OSTaskStkInit()这个函数。这个函数主要用于任务堆栈的初始化。
C:os_cpu_a.asm主要是与处理器相关的汇编代码。占移植工作的70%。(不过我不写,哈哈哈)实现的是下面五个与处理器相关的函数。
1、OS_CPU_SR_Save();关中断函数
2、OS_CPU_SR_Restore();恢复中断函数
3、OSStartHighRdy();启动最高优先级任务运行
4、OSCtxSw();任务级任务切换
5、OSIntCtxSw();ISR中执行任务级任务切换
D:os_dbg.c主要是一些变量。不用写,把源码里的os_dbg_r.c改名为os_dbg.c即可
最后就是与应用层相关的配置文件了,都被我放进APP文件夹里了。主要有app_cfg.h和os_cfg.h两个文件。os_cfg.h直接把
os_cfg_r.h改名为os_cfg.h就可以了,主要是裁剪操作系统用的,里面是操作系统功能开关和配置。app_cfg.h是放APP层里面建立
任务的优先级和堆栈大小的。
差点忘了说了,移植时千万注意启动文件的修改。。。官方给的工程是自己写的启动文件,而且它自己写了中断服务控制,我习惯了直接调用中断,因此没有使用官
方这方面的源码,而且就速度说,多重的函数调用肯定比直接调用慢的。我直接使用了固件库的启动文件。之前就是因为没有修改好所以悲剧的。。。移植不难,难
的是移植过程一大堆你不知道解决方法的问题而已。不要认为看了我的这篇东西自己就可以移植了。哈哈,少年,你还不懂~
STM32固件库3.5+uCOS2.86移植(转自暴走的工程师)的更多相关文章
- 在IAR(EWARM)中移植STM32固件库
一.移植环境说明 (1).win10系统 (2).IAR(EWARM)7.7 (3).STM32标准固件库3.5.0 http://www.st.com/content/st_com/en/produ ...
- STM32固件库详解
STM32固件库详解 emouse原创文章,转载请注明出处http://www.cnblogs.com/emouse/ 应部分网友要求,最新加入固件库以及开发环境使用入门视频教程,同时提供例程模板 ...
- 第9章 初识STM32固件库
第9章 初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 第9章 初识STM32固件库—零死角玩转STM32-F429系列
第9章 初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- (一)STM32固件库详解(转载)
本篇博文是转载自emouse,因为不能直接转载,所以是复制过来再发布的. emouse原创文章,转载请注明出处http://www.cnblogs.com/emouse/ 1.1 基于标准外设库的 ...
- STM32固件库
一.STM32固件库开发和传统寄存器开发方式的区别 二.CMSIS标准 CMSIS标准--Cortex Microcontroller Software Interface Standard,是ARM ...
- STM32固件库文件分析
STM32固件库文件分析 1.汇编编写的启动文件 startup/stm32f10x.hd.s:设置堆栈指针,设置pc指针,初始化中断向量,配置系统时钟,对用c库函数_main最后去c语言世界里. 2 ...
- STM32 HAL库详解 及 手动移植
源: STM32 HAL库详解 及 手动移植
- STM32固件库模板下载以及固件库学习方法
固件库模板下载 固件库模板新建过程: 下载我们上节的固件库文件 电脑新建一个文件夹命名为Fwlib-Template,在此文件夹下分别新建DOC Libraries Project User 这四个文 ...
随机推荐
- React Native 的绑定 this
在React Native开发中,如果使用ES6语法的话,最好绑定this.但是使用ES5语法的话不需要绑定this.因为ES5会autobinding. this所指的就是直至包含this指针的上层 ...
- codeforces 731C(DFS)
题目链接:http://codeforces.com/contest/731/problem/C 题意:有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少 ...
- 深入理解ecshop2.7.3整合discuzX3.2(97%的完美方案)
转载http://blog.csdn.net/squallleonheart/article/details/39555259 ecshop整合discuzX3.2 ecshop安装包:ECShop_ ...
- wordpress模板学习之导航目录
wordpress的导航目录分为三个部分,一开启,二配置:三使用 开启在functions.php,这个注册会保存在全局变量中,接下来在菜单配置中会看到 register_nav_menu( 'pri ...
- PPP 转义字符 编码 和 解码
#include <stdio.h> #include <string.h> // PPP数据帧每一帧都以标识字符0x7E开始和结束: // 由于标识字符的值是0x7E,因此当 ...
- 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server
原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...
- ion-header-bar
ion-header-bar 指令声明一个标题栏元素,标题栏总是位于屏幕顶部 它有两个同级的可选属性 align-title:设置标题文字的对齐方式.允许值:left|right|center no- ...
- python unicode 和 str 类型的关系
python (2.X)在进行 运行时候字符串运算的时候, 分为两种类型 str, unicode 前者是 二进制的形式进行对字符串的保存, 后者是 以unicode的方式进行保存, 一般的工作方式为 ...
- CoreData数据库
一 CoreData 了解 1 CoreData 数据持久化框架是 Cocoa API 的一部分,首先在iOSS5 版本的系统中出现: 它允许按照 实体-属性-值 模式组织数据: ...
- WebAPI的Get和Post访问
/// <summary> /// MVC 调用webapi接口返回框架快捷按钮和一级菜单(Get) /// </summary> /// <param name=&qu ...