从零开始创建uCosIII项目(二):配置uCosIII

添加BSP文件

新建BSP.h文件,内容如下

#ifndef _BSP_H_
#define _BSP_H_

#include  <stdarg.h>
#include  <stdio.h>

#include  <cpu.h>
#include  <cpu_core.h>

#include  <lib_ascii.h>
#include  <lib_def.h>
#include  <lib_mem.h>
#include  <lib_str.h>

#include  <stm32f10x.h>

#include  <app_cfg.h>


void         BSP_Init                    (void);
void         BSP_IntDisAll               (void);
CPU_INT32U   BSP_CPU_ClkFreq             (void);


#endif

新建BSP.c文件,内容如下

/* Includes ------------------------------------------------------------------*/
#include "BSP.h"

/* Private define ------------------------------------------------------------*/
#define  DWT_CR      *(CPU_REG32 *)0xE0001000
#define  DWT_CYCCNT  *(CPU_REG32 *)0xE0001004
#define  DEM_CR      *(CPU_REG32 *)0xE000EDFC
#define  DBGMCU_CR   *(CPU_REG32 *)0xE0042004

#define  DEM_CR_TRCENA                   (1 << 24)
#define  DWT_CR_CYCCNTENA                (1 <<  0)

/* Periph functions ---------------------------------------------------------*/
void SysTick_Configuration(void);


void BSP_Init(void)
{
    /* Configure the SysTick to generate an interrupt each 1 millisecond */
    SysTick_Configuration();
}

void  BSP_IntDisAll (void)
{
    CPU_IntDis();
}

CPU_INT32U  BSP_CPU_ClkFreq (void)
{
    RCC_ClocksTypeDef  rcc_clocks;


    RCC_GetClocksFreq(&rcc_clocks);

    return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
}

void  CPU_TS_TmrInit (void)
{
    CPU_INT32U  cpu_clk_freq_hz;


    DEM_CR         |= (CPU_INT32U)DEM_CR_TRCENA;                /* Enable Cortex-M3's DWT CYCCNT reg.                   */
    DWT_CYCCNT      = (CPU_INT32U)0u;
    DWT_CR         |= (CPU_INT32U)DWT_CR_CYCCNTENA;

    cpu_clk_freq_hz = BSP_CPU_ClkFreq();
    CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
}

CPU_TS_TMR  CPU_TS_TmrRd (void)
{
    return ((CPU_TS_TMR)DWT_CYCCNT);
}


/**
  * @brief  Configures the SysTick to generate an interrupt each 1 ms.
  * @param  None
  * @retval None
  */
void SysTick_Configuration(void)
{
    /* SysTick interrupt each 1 ms with SysTick Clock equal to (HCLK/8) */
    if (SysTick_Config(SystemCoreClock / 1000))
    {
        /* Capture error */
        while (1);
    }
}

可在User文件夹下新建BSP文件夹,把这两个文件放进去。上一篇工程设置里已经把BSP路径包含进来了。

打开includes.h文件,去掉64和65行,改为#include  <bsp.h>。

现在再次编译一遍,应该可以通过了。


运行uCOS

修改μCOS-III\uC-CPU\Cfg\cpu_cfg.h

第135行:#if 1改为#if 0,表示不测量关中断时间。

修改μCOS-III\uCOS-III\Cfg\os_cfg.h

第42行:#define OS_CFG_ISR_POST_DEFERRED_EN     0u,表示关闭中断延迟提交

第44行:#define OS_CFG_TS_EN                    1u改为0u,表示不时间采样

第50行:#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN                    1u改为0u,表示不测量任务调度时间

第63行:#define OS_CFG_MEM_EN                    1u改为0u,表示不使用内存管理(后面将介绍一个更好的内存池)

第76行:#define OS_CFG_Q_PEND_ABORT_EN                    1u改为0u

第82行:#define OS_CFG_SEM_PEND_ABORT_EN                    1u改为0u

第87行:#define OS_CFG_STAT_TASK_EN                    1u改为0u,表示不创建统计任务

第96行:#define OS_CFG_TASK_SEM_PEND_ABORT_EN                    1u改为0u

官方手册中有这样说明

“最低程度, uC/OS-III须创建空闲任务OS_IdleTask(),当没有其他任务运行时就运行空闲任务。uC/OS-III也创建时基任务。 根据配置文件中所配置的,uC/OS-III 会创建统计任务 OS_StatTask()、定时器任务OS_TmrTask()、中断队列处理任务OS_IntQTask()。”

这里我们取消了OS_StatTask()和OS_IntQTask(),分别由OS_CFG_STAT_TASK_EN和OS_CFG_ISR_POST_DEFERRED_EN决定,所以系统运行起来后,最少有四个任务(外加创建任务的任务)在运行。

关于如何将uCos时基与STM32硬件时钟绑定,有两种方式:一种是修改startup_stm32f10x_md.s文件中的PendSV_Handler为OS_CPU_PendSVHandler,SysTick_Handler为OS_CPU_SysTickHandler;另外一种是修改uCOS-III\Ports下的os_cpu.h、os_cpu_a.asm和os_cpu_c.c中的OS_CPU_PendSVHandler为PendSVHandler、OS_CPU_SysTickHandler为SysTickHandler,并去掉PendSV_Handler和SysTick_Handler在stm32f10x_it中的声明和定义。

这里我觉得采用第二种比较合适。

在app.c中的142行处设置断点,启动程序,怎么样,是不是每隔200毫秒break一次呢。


看我大招
工程源码点击打开链接

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值