ucosiii 移植
最近想在 f429 上面使用 mdk526 版本的 IDE,配合 HAL 和ucosiii??紤]到的方法是對(duì)比 v7 開(kāi)發(fā)板的 ucosiii 和裸機(jī)程序,找出需要修改的地方,然后對(duì)比 v6 開(kāi)發(fā)板的 ucosiii 和 裸機(jī)程序,然后把相應(yīng)的修改融合起來(lái)即可。
一。 V7開(kāi)發(fā)板 ucosiii 和 裸機(jī)程序?qū)Ρ炔顒e:
工程配置中頭文件包含增加了:
....\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增加整個(gè) 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
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_DelayMS
* 功能說(shuō)明: ms級(jí)延遲,延遲精度為正負(fù)1ms
* 形 參: n : 延遲長(zhǎng)度,單位1 ms。 n 應(yīng)大于2
* 返 回 值: 無(wú)
*********************************************************************************************************
*/
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
/*
*********************************************************************************************************
* 函 數(shù) 名: SysTick_Handler
* 功能說(shuō)明: 系統(tǒng)嘀嗒定時(shí)器中斷服務(wù)程序。啟動(dòng)文件中引用了該函數(shù)。
* 形 參: 無(wú)
* 返 回 值: 無(wú)
*********************************************************************************************************
*/
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"
/*
*********************************************************************************************************
* 函數(shù)聲明
*********************************************************************************************************
*/
static void SystemClock_Config(void);
static void CPU_CACHE_Enable(void);
static void MPU_Config(void);
/*
*********************************************************************************************************
* 函 數(shù) 名: System_Init
* 功能說(shuō)明: 系統(tǒng)初始化,主要是MPU,Cache和系統(tǒng)時(shí)鐘配置
* 形 參:無(wú)
* 返 回 值: 無(wú)
*********************************************************************************************************
*/
void System_Init(void)
{
/* 配置MPU */
MPU_Config();
...
#if Enable_EventRecorder == 1
/* 初始化EventRecorder并開(kāi)啟 */
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
#endif
}
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_Init
* 功能說(shuō)明: 初始化所有的硬件設(shè)備。該函數(shù)配置CPU寄存器和外設(shè)的寄存器并初始化一些全局變量。只需要調(diào)用一次
* 形 參: 無(wú)
* 返 回 值: 無(wú)
*********************************************************************************************************
*/
void bsp_Init(void)
{
//bsp_InitDWT(); /* 初始化CM7內(nèi)核的時(shí)鐘周期計(jì)數(shù)器 */
bsp_InitKey(); /* 按鍵初始化,要放在滴答定時(shí)器之前,因?yàn)榘粹o檢測(cè)是通過(guò)滴答定時(shí)器掃描 */
bsp_InitUart(); /* 初始化串口 */
...
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_DelayMS
* 功能說(shuō)明: 為了讓底層驅(qū)動(dòng)在帶RTOS和裸機(jī)情況下有更好的兼容性
* 專門制作一個(gè)阻塞式的延遲函數(shù),在底層驅(qū)動(dòng)中ms毫秒延遲主要用于初始化,并不會(huì)影響實(shí)時(shí)性。
* 形 參: n 延遲長(zhǎng)度,單位1 ms
* 返 回 值: 無(wú)
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t _ulDelayTime)
{
bsp_DelayUS(1000*_ulDelayTime);
}
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_DelayUS
* 功能說(shuō)明: 這里的延時(shí)采用CPU的內(nèi)部計(jì)數(shù)實(shí)現(xiàn),32位計(jì)數(shù)器
* OSSchedLock(&err);
* bsp_DelayUS(5);
* OSSchedUnlock(&err); 根據(jù)實(shí)際情況看看是否需要加調(diào)度鎖或選擇關(guān)中斷
* 形 參: _ulDelayTime 延遲長(zhǎng)度,單位1 us
* 返 回 值: 無(wú)
* 說(shuō) 明: 1. 主頻168MHz的情況下,32位計(jì)數(shù)器計(jì)滿是2^32/168000000 = 25.565秒
* 建議使用本函數(shù)做延遲的話,延遲在1秒以下。
* 2. 實(shí)際通過(guò)示波器測(cè)試,微妙延遲函數(shù)比實(shí)際設(shè)置實(shí)際多運(yùn)行0.25us左右的時(shí)間。
* 下面數(shù)據(jù)測(cè)試條件:
* (1). MDK5.15,優(yōu)化等級(jí)0, 不同的MDK優(yōu)化等級(jí)對(duì)其沒(méi)有影響。
* (2). STM32F407IGT6
* (3). 測(cè)試方法:
* GPIOI->BSRRL = GPIO_Pin_8;
* bsp_DelayUS(10);
* GPIOI->BSRRH = GPIO_Pin_8;
* -------------------------------------------
* 測(cè)試 實(shí)際執(zhí)行
* 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. 兩個(gè)32位無(wú)符號(hào)數(shù)相減,獲取的結(jié)果再賦值給32位無(wú)符號(hào)數(shù)依然可以正確的獲取差值。
* 假如A,B,C都是32位無(wú)符號(hào)數(shù)。
* 如果A > B 那么A - B = C,這個(gè)很好理解,完全沒(méi)有問(wèn)題
* 如果A < B 那么A - B = C, C的數(shù)值就是0xFFFFFFFF - B + A + 1。這一點(diǎn)要特別注意,正好用于本函數(shù)。
*********************************************************************************************************
*/
void bsp_DelayUS(uint32_t _ulDelayTime)
{
uint32_t tCnt, tDelayCnt;
uint32_t tStart;
tStart = (uint32_t)CPU_TS_TmrRd(); /* 剛進(jìn)入時(shí)的計(jì)數(shù)器值 */
tCnt = 0;
tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000); /* 需要的節(jié)拍數(shù) */
while(tCnt < tDelayCnt)
{
tCnt = (uint32_t)CPU_TS_TmrRd() - tStart; /* 求減過(guò)程中,如果發(fā)生第一次32位計(jì)數(shù)器重新計(jì)數(shù),依然可以正確計(jì)算 */
}
}
- 修改 bsp.h
/* CPU空閑時(shí)執(zhí)行的函數(shù) */
//#define CPU_IDLE() bsp_Idle()
/* 使能在源文件中使用uCOS-III的函數(shù), 這里的源文件主要是指BSP驅(qū)動(dòng)文件 */
#define uCOS_EN 1
#if uCOS_EN == 1
#include "os.h"
#define ENABLE_INT() CPU_CRITICAL_EXIT() /* 使能全局中斷 */
#define DISABLE_INT() CPU_CRITICAL_ENTER() /* 禁止全局中斷 */
#else
/* 開(kāi)關(guān)全局中斷的宏 */
#define ENABLE_INT() __set_PRIMASK(0) /* 使能全局中斷 */
#define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中斷 */
#endif
/* 提供給其他C文件調(diào)用的函數(shù) */
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。
總結(jié)
以上是生活随笔為你收集整理的ucosiii 移植的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring(5) -(14) poin
- 下一篇: 《模式识别导论》特性选择与特征提取概要