UCOSIII_定时器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UCOSIII_定时器相关的知识,希望对你有一定的参考价值。

参考技术A 定时器实际就是一个递减的计数器,递减到0会触发一个动作,这个动作就是回调函数。

使用OSTmrCreate()来创建一个定时器:

通过OSTmrStart()可以开启定时器
OSTmrStop()可以删除定时器
创建之前需要先定义一个定时器的结构体 OS_TMR tmr1; //定时器tmr1
定时器tmr1的回调函数是void tmr1_callback(void *p_tmr, void *p_arg);
注意回调函数中不能有阻塞或删除定时器的任务。
定时器的分辨率是宏OS_CFG_TMR_TASK_RATE_HZ确定,分辨率=1000/OS_CFG_TMR_TASK_RATE_HZ (ms)

ucosiii 移植

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

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

  1. 工程配置中头文件包含增加了:
    ....uCOS-IIIuC-CPU
    ....uCOS-IIIuC-CPUARM-Cortex-MARMv7-MRealView
    ....uCOS-IIIuC-LIB
    ....uCOS-IIIuCOS-IIISource
    ....uCOS-IIIuCOS-IIIPortsARM-Cortex-MARMv7-MRealView

  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
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
  1. 修改 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位计数器重新计数,依然可以正确计算 */    
    }
}
  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
/* 提供给其他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。

以上是关于UCOSIII_定时器的主要内容,如果未能解决你的问题,请参考以下文章

UCOSiii软件定时器

ucosiii浅析内核对象-软件定时器

UCOSIII任务管理

UCOSIII中的节拍列表更新

08第二种定时器_封装动画函数_轮播图_offset系列

jquery_12js基础_定时器