ucosiii 移植
最近想在 f429 上面使用 mdk526 版本的 IDE,配合 HAL 和ucosiii。考虑到的方法是对比 v7 开发板的 ucosiii 和裸机程序,找出需要修改的地方,然后对比 v6 开发板的 ucosiii 和 裸机程序,然后把相应的修改融合起来即可。
一。 V7开发板 ucosiii 和 裸机程序对比差别:
工程配置中头文件包含增加了:
....\uCOS-III\uC-CPU
....\uCOS-III\uC-CPU\ARM-Cortex-M\ARMv7-M\RealView
....\uCOS-III\uC-LIB
....\uCOS-III\uCOS-III\Source
....\uCOS-III\uCOS-III\Ports\ARM-Cortex-M\ARMv7-M\RealView增加整个 UCOSIII文件夹,包含 uC-CPU, uC-LIB,uCOS-III。
修改了 bsp_timer.c 文件
void bsp_InitTimer(void)
{
...
#if uCOS_EN == 0
SysTick_Config(SystemCoreClock / 1000);
#endif
...
}
#if uCOS_EN == 0
/*
*********************************************************************************************************
* 函 数 名: bsp_DelayMS
* 功能说明: ms级延迟,延迟精度为正负1ms
* 形 参: n : 延迟长度,单位1 ms。 n 应大于2
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t n)
{
...
}
void bsp_DelayUS(uint32_t n)
{
...
}
#endif
void bsp_StartTimer(uint8_t _id, uint32_t _period)
{
#if uCOS_EN == 1
CPU_SR_ALLOC();
#endif
...
void bsp_StartAutoTimer(uint8_t _id, uint32_t _period)
{
#if uCOS_EN == 1
CPU_SR_ALLOC();
#endif
...
void bsp_StopTimer(uint8_t _id)
{
#if uCOS_EN == 1
CPU_SR_ALLOC();
#endif
int32_t bsp_GetRunTime(void)
{
int32_t runtime;
#if uCOS_EN == 1
CPU_SR_ALLOC();
#endif
int32_t bsp_CheckRunTime(int32_t _LastTime)
{
int32_t now_time;
int32_t time_diff;
#if uCOS_EN == 1
CPU_SR_ALLOC();
#endif
#if uCOS_EN == 0
/*
*********************************************************************************************************
* 函 数 名: SysTick_Handler
* 功能说明: 系统嘀嗒定时器中断服务程序。启动文件中引用了该函数。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void SysTick_Handler(void)
{
...
}
#endif
- 修改 bsp_uart_fifo.c
static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen)
{
uint16_t i;
#if uCOS_EN == 1
CPU_SR_ALLOC();
#endif
static uint8_t UartGetChar(UART_T *_pUart, uint8_t *_pByte)
{
uint16_t usCount;
#if uCOS_EN == 1
CPU_SR_ALLOC();
#endif
- 修改 bsp.c
#include "includes.h"
/*
*********************************************************************************************************
* 函数声明
*********************************************************************************************************
*/
static void SystemClock_Config(void);
static void CPU_CACHE_Enable(void);
static void MPU_Config(void);
/*
*********************************************************************************************************
* 函 数 名: System_Init
* 功能说明: 系统初始化,主要是MPU,Cache和系统时钟配置
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void System_Init(void)
{
/* 配置MPU */
MPU_Config();
...
#if Enable_EventRecorder == 1
/* 初始化EventRecorder并开启 */
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
#endif
}
/*
*********************************************************************************************************
* 函 数 名: bsp_Init
* 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{
//bsp_InitDWT(); /* 初始化CM7内核的时钟周期计数器 */
bsp_InitKey(); /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
bsp_InitUart(); /* 初始化串口 */
...
/*
*********************************************************************************************************
* 函 数 名: bsp_DelayMS
* 功能说明: 为了让底层驱动在带RTOS和裸机情况下有更好的兼容性
* 专门制作一个阻塞式的延迟函数,在底层驱动中ms毫秒延迟主要用于初始化,并不会影响实时性。
* 形 参: n 延迟长度,单位1 ms
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t _ulDelayTime)
{
bsp_DelayUS(1000*_ulDelayTime);
}
/*
*********************************************************************************************************
* 函 数 名: bsp_DelayUS
* 功能说明: 这里的延时采用CPU的内部计数实现,32位计数器
* OSSchedLock(&err);
* bsp_DelayUS(5);
* OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断
* 形 参: _ulDelayTime 延迟长度,单位1 us
* 返 回 值: 无
* 说 明: 1. 主频168MHz的情况下,32位计数器计满是2^32/168000000 = 25.565秒
* 建议使用本函数做延迟的话,延迟在1秒以下。
* 2. 实际通过示波器测试,微妙延迟函数比实际设置实际多运行0.25us左右的时间。
* 下面数据测试条件:
* (1). MDK5.15,优化等级0, 不同的MDK优化等级对其没有影响。
* (2). STM32F407IGT6
* (3). 测试方法:
* GPIOI->BSRRL = GPIO_Pin_8;
* bsp_DelayUS(10);
* GPIOI->BSRRH = GPIO_Pin_8;
* -------------------------------------------
* 测试 实际执行
* bsp_DelayUS(1) 1.2360us
* bsp_DelayUS(2) 2.256us
* bsp_DelayUS(3) 3.256us
* bsp_DelayUS(4) 4.256us
* bsp_DelayUS(5) 5.276us
* bsp_DelayUS(6) 6.276us
* bsp_DelayUS(7) 7.276us
* bsp_DelayUS(8) 8.276us
* bsp_DelayUS(9) 9.276us
* bsp_DelayUS(10) 10.28us
* 3. 两个32位无符号数相减,获取的结果再赋值给32位无符号数依然可以正确的获取差值。
* 假如A,B,C都是32位无符号数。
* 如果A > B 那么A - B = C,这个很好理解,完全没有问题
* 如果A < B 那么A - B = C, C的数值就是0xFFFFFFFF - B + A + 1。这一点要特别注意,正好用于本函数。
*********************************************************************************************************
*/
void bsp_DelayUS(uint32_t _ulDelayTime)
{
uint32_t tCnt, tDelayCnt;
uint32_t tStart;
tStart = (uint32_t)CPU_TS_TmrRd(); /* 刚进入时的计数器值 */
tCnt = 0;
tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000); /* 需要的节拍数 */
while(tCnt < tDelayCnt)
{
tCnt = (uint32_t)CPU_TS_TmrRd() - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */
}
}
- 修改 bsp.h
/* CPU空闲时执行的函数 */
//#define CPU_IDLE() bsp_Idle()
/* 使能在源文件中使用uCOS-III的函数, 这里的源文件主要是指BSP驱动文件 */
#define uCOS_EN 1
#if uCOS_EN == 1
#include "os.h"
#define ENABLE_INT() CPU_CRITICAL_EXIT() /* 使能全局中断 */
#define DISABLE_INT() CPU_CRITICAL_ENTER() /* 禁止全局中断 */
#else
/* 开关全局中断的宏 */
#define ENABLE_INT() __set_PRIMASK(0) /* 使能全局中断 */
#define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中断 */
#endif
/* 提供给其他C文件调用的函数 */
void bsp_Init(void);
void bsp_Idle(void);
void System_Init(void);
增加 bsp_clk.c, bsp_clk.h, bsp_cpu.c, bsp_int.h, bsp_int_armv7m.c, bsp_os.c, bsp_os.h。
修改 stm32h7xx_it.c
void DebugMon_Handler(void)
{
}
/**
* @brief This function handles PendSVC exception.
* @param None
* @retval None
*/
void PendSV_Handler(void)
{
}
- 增加 app_cfg.h, cpu_cfg.h, includes.h, lib_cfg.h, os_app_hooks.c, os_app_hooks.h, os_cfg.h, os_cfg_app.h, stm32h7xx_hal_timebase_tim.c。
ucosiii 移植的更多相关文章
- [STM32F429-DISCO-uCosiii]3.uCOSIII 移植
uCOSiii的结构比uCOSii看上去是清晰了不少,也比较有条理,所以呢,移植不是让人感觉很乱.在工程中添加如下目录和文件 与CPU相关的文件都集中在uC-CPU文件夹中.这部分有很多是底层的实现, ...
- 玩转X-CTR100 l STM32F4 l UCOS-III移植
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 概述 前后台系统 简单的小型系统设计一般是基于前后台 ...
- uCos-III移植到STM32F10x
最近在百度上看了uCOS-III 的介绍后,诸多功能有很大的提升和改进,感觉有必要升级一下开发环境.百度介绍:http://baike.baidu.com/view/8531313.htm 环境: S ...
- 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告
<基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ...
- stm32
GPIO NVIC TIME USART ONE WIRE IIC SPI PWM ADC LCD XPT UCOSiii移植 定时器 蓝牙 陀螺仪
- ETH—Lwip以太网通信
第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- 第39章 ETH—Lwip以太网通信
第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- [ucos]了解ucos
1. uCosIII移植到STM32F10x http://www.cnblogs.com/hiker-blogs/archive/2012/06/13/2547176.html 2. uCosIII ...
- 第39章 ETH—Lwip以太网通信—零死角玩转STM32-F429系列
第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
随机推荐
- List转为字符串
2019-12-12 20:34:16 方法1: 转换后的格式为:"('111','112','1113')" List list = new ArrayList<>( ...
- 二次代价函数、交叉熵(cross-entropy)、对数似然代价函数(log-likelihood cost)(04-1)
二次代价函数 $C = \frac{1} {2n} \sum_{x_1,...x_n} \|y(x)-a^L(x) \|^2$ 其中,C表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本 ...
- 【PAT甲级】1036 Boys vs Girls (25 分)
题意: 输入一个正整数N(题干没指出范围,默认1e5可以AC),接下来输入N行数据,每行包括一名学生的姓名,性别,学号和分数.输出三行,分别为最高分女性学生的姓名和学号,最低分男性学生的姓名和学号,前 ...
- 学习java时在要求输出的数字带俩个小数点时,利用String.format时出现的问题
public class StringFormatDemo { public static void main(String[] args) { //String.format 实现了四舍五入 Sys ...
- what is 'linesize alignment' meaning?
链接: https://stackoverflow.com/questions/35678041/what-is-linesize-alignment-meaning
- SRS——打开 stream caster
按照默认的配置编译启动后,发现 stream caster 不起作用,启动时报如下警告: [-- ::][][] stream caster: off 原因是编译SRS时没有打开StreamCaste ...
- 移动端300毫秒事件响应延迟解决方法[fastclick]
vue-cli[2.x]中: 安装 npm install fastclick --save 使用: 在main.js中 :先 import fastClick from 'fastclick' 然后 ...
- red hat 7、centos7的root密码破译
一.在开机画面时按"E". 二.找到linux16开头的这段,在段尾添加空格"rd.break"然后按Ctrl+x进入系统紧急救援模式. 三.新的界面出现命令行 ...
- Python 之并发编程之进程中(守护进程(daemon)、锁(Lock)、Semaphore(信号量))
五:守护进程 正常情况下,主进程默认等待子进程调用结束之后再结束守护进程在主进程所有代码执行完毕之后,自动终止kill -9 进程号 杀死进程.守护进程的语法:进程对象.daemon = True设置 ...
- UniGUI之ServerModule常用设置(07)
主要有两个设置,它是一个单独的, 这意味着它只在每个应用程序中创建一次. 它主要用于配置各种服务器设置.不能将组件放在ServerModule上. 如前所述, ServerModule 是一个单一的, ...