最近想在 f429 上面使用 mdk526 版本的 IDE,配合 HAL 和ucosiii。考虑到的方法是对比 v7 开发板的 ucosiii 和裸机程序,找出需要修改的地方,然后对比 v6 开发板的 ucosiii 和 裸机程序,然后把相应的修改融合起来即可。

一。 V7开发板 ucosiii 和 裸机程序对比差别:

  1. 工程配置中头文件包含增加了: ....\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

  2. 增加整个 UCOSIII文件夹,包含 uC-CPU, uC-LIB,uCOS-III。

  3. 修改了 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


```code
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
  1. 修改 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
  2. 修改 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(); / 初始化串口 */ ...

    
    ```code
    /*
    *********************************************************************************************************
  • 函 数 名: 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秒以下。
    1. 实际通过示波器测试,微妙延迟函数比实际设置实际多运行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
    1. 两个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位计数器重新计数,依然可以正确计算 /
    } }

  1. 修改 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

```code
/* 提供给其他C文件调用的函数 */
void bsp_Init(void);
void bsp_Idle(void);
void System_Init(void);
  1. 增加 bsp_clk.c, bsp_clk.h, bsp_cpu.c, bsp_int.h, bsp_int_armv7m.c, bsp_os.c, bsp_os.h。

  2. 修改 stm32h7xx_it.c
    
    void DebugMon_Handler(void)
    {
    }

/**

  • @brief This function handles PendSVC exception.
  • @param None
  • @retval None */ void PendSV_Handler(void) { }
  1. 增加 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。

标签: UCOS

添加新评论