STM32F103移植uCOS-III,keil4调试卡在CPU_TS_TmrRd函数过不去

发布者:科技火箭最新更新时间:2019-07-23 来源: eefocus关键字:STM32F103  移植uCOS-III  keil4  CPU_TS_TmrRd函数 手机看文章 扫描二维码
随时随地手机看文章

最近项目需要在STM32F103板子上移植uCOS-III系统,移植过程参考安富莱STM32F407之uCOS-III教程,参考网址


移植uCOS-III系统

虽然教程是关于F407的板子,但大体是相同的。为了省事,我直接在原来的工程中加上uCOS-III源代码。首先在工程目录下创建一个uCOS-III文件夹,然后把安富莱的uCOS-III代码拷贝到新建的uCOS-III文件夹中,对应的目录如下:

系统源码目录

这里我把原来uCOS-III下Ports和Source目录分开为uCOS-Ports和uCOS-Source。uCOS-User目录存放的是安富莱User目录下文件,是需要自己配置修改的一些文件,这里把bsp.h、bsp.c文件重新更名为bsp_os.h、bsp_os.c,并且原来像诸如ARM-Cortex-M3目录下有多个平台的文件夹:

保留RealView目录文件

这里把其他的都删除,只保留RealView下面的文件。然后把这些文件分文件夹添加到原来的工程中,工程结构如下:

工程结构

uCOS-User目录下文件:

uCOS-User目录下

人家F407用的是startup_stm32f429_439xx.s汇编文件,我这里用的是startup_stm32f10x_hd.s,因此还要在这个文件里修改中断向量表,把PendSV_Handler和SysTick_Handler替换为OS_CPU_PendSVHandler和OS_CPU_SysTickHandler:

替换中断向量表

然后下面定义的地方也需要相应的替换下:

替换中断定义

源文件添加完了,别忘了添加头文件的路径:


工程配置头文件
头文件路径

这样uCOS-III源代码就算添加完成了,但这里有一处源码需要修改,uCOS-PortsARM-Cortex-M3os_cpu_c.c文件:

#include  "../../../../Source/os.h"


由于原来文件在uCOS-IIIPortsARM-Cortex-M3GenericRealView目录,这里目录发生变化了,找不到os.h文件,得修改如下:


#include  "../../uCOS-Source/os.h"


创建任务

main函数中按照安富莱的例子写:

int main(void)

    OS_ERR  err;  

    OSInit(&err);  


OSTaskCreate((OS_TCB       *)&AppTaskStartTCB,  

                 (CPU_CHAR     *)"App Task Start",  

                 (OS_TASK_PTR   )AppTaskStart,     

                 (void         *)0,                

                 (OS_PRIO       )APP_CFG_TASK_START_PRIO, 

                 (CPU_STK      *)&AppTaskStartStk[0],    

                 (CPU_STK_SIZE  )APP_CFG_TASK_START_STK_SIZE / 10, 

                 (CPU_STK_SIZE  )APP_CFG_TASK_START_STK_SIZE,    

                 (OS_MSG_QTY    )0, 

                 (OS_TICK       )0,  

                 (void         *)0,  

                 (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),

                 (OS_ERR       *)&err);

  OSStart(&err);                                               

  (void)&err;

  return (0);

}


AppTaskStart函数中创建其他任务:


static  void  AppTaskStart (void *p_arg)

{

    OS_ERR  err;

    (void)p_arg;

    CPU_Init(); 

    bsp_Init();

    BSP_Tick_Init();

#if OS_CFG_STAT_TASK_EN > 0u

     OSStatTaskCPUUsageInit(&err);   

#endif


#ifdef CPU_CFG_INT_DIS_MEAS_EN

    CPU_IntDisMeasMaxCurReset();

#endif

    

    AppTaskCreate(); 

    while (1)

    {  

  if(Sys_RunInfo.PowerDownFlag == 0)

  {

  Key_Process();             

  }

  OSTimeDly(10, OS_OPT_TIME_DLY, &err);

    }

}


创建完其他任务,这个任务只负责按键处理。简单测试代码写好了,赶紧调试一下看看能运行不。


调试

为了调试方便,这里先不拿实际板子调试,先进行软件仿真:

仿真调试

结果发现总是过不了OSInit函数,总卡在CPU_TS_TmrRd函数最后:

卡在CPU_TS_TmrRd

查了查相关资料,这是计算时间戳相关的函数,难道是软件仿真不能计算任务的执行时间,以及CPU利用率?那么关闭这项功能试试,打开cpu_cfg.h文件:

关闭CPU_CFG_TS_32_EN

原来宏CPU_CFG_TS_32_EN是打开的,把它关掉:

#define  CPU_CFG_TS_32_EN        DEF_DISABLED


再编译,居然出错了:


#35: #error directive: "CPU_CFG.H,        CPU_CFG_TS_32_EN must be Enabled (1) to use time stamp feature"


定位到os.h文件中报错地方:

os.h文件

看来关闭CPU_CFG_TS_EN宏就必须同时关闭OS_CFG_TS_EN宏,那么CPU_CFG_TS_EN宏是哪来的呢,在cpu_core.h文件中有相关配置:

CPU_CFG_TS_EN宏

关闭了CPU_CFG_TS_32_EN就意味着CPU_CFG_TS_EN宏也关闭,那么要不报错,就得关闭OS_CFG_TS_EN宏,在os_cfg.h文件中:


#define OS_CFG_TS_EN                    DEF_DISABLED


改完再编译,又报错了:

#error directive: “OS_CFG.H, OS_CFG_TS_EN must be Enabled (1) to measure scheduler lock time”

再次定位问题,还是在os.h文件:

os.h文件

看来还得关闭OS_CFG_SCHED_LOCK_TIME_MEAS_EN宏,因为这个宏是包含测量调度锁定时间的代码,同样修改os_cfg.h文件:


#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN  DEF_ENABLED  


再次编译,还是报错:


error:  #20: identifier "OSIntDisTimeMax" is undefined


这次定位到os_dbg.c文件:

OSIntDisTimeMax未定义

是因为CPU_CFG_INT_DIS_MEAS_EN宏导致错误,而在cpu_cfg.h文件中开启了这个宏:

CPU_CFG_INT_DIS_MEAS_EN宏

再把这个宏屏蔽掉,如下图:

关闭CPU_CFG_INT_DIS_MEAS_EN

这次编译终于没有错误了,赶紧调试一下吧,这次终于通过了OSInit函数,这样便可以进行软件仿真了:


记住,如果要测试任务调度时间和CPU使用率的话还是要把上面关掉的宏都打开的,只有去真正板子上进行测试了。

通过OSInit函数


关键字:STM32F103  移植uCOS-III  keil4  CPU_TS_TmrRd函数 引用地址:STM32F103移植uCOS-III,keil4调试卡在CPU_TS_TmrRd函数过不去

上一篇:STM32不用固件库易产生的问题:Undefined symbol SystemInit
下一篇:编写STM32项目遇到的报错

推荐阅读最新更新时间:2024-11-03 05:38

STM32F103ZET定时器TIM1输出六路带死区互补PWM波形
使用默认引脚输出6路PWM,#define FullRemap_TIM1则重映射 PIN脚; 遗留问题:调用TIM_CCxNCmd(TIM1, TIM_Channel_X, TIM_CCx_Enable);导致互补PWM无输出。 TIM_CCxCmd(TIM1, TIM_Channel_X, TIM_CCx);确可以正常开关PWM输出; 遇到问题:PA8、10、PB13、14、15均有输出,PA9无输出; 问题解决:虽然没初始化UART1模块,但打开RCC_APB2Periph_USART1时钟导致; void Timer1_Init(void) { TIM_OCInitTypeDef TIM_OCIni
[单片机]
STM32F103实现IAP在线升级应用程序
一、环境介绍 MCU: STM32F103ZET6 编程IDE: Keil5.25 工程附加源码包下载地址: CSDN https://download.csdn.net/download/xiaolong1126626497/25652410 二、 IAP介绍 IAP,全称是“In-Application Programming”,中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口(如USART,IIC,CAN,USB,以太网接口甚至是无线射频通道)对正在运行程序的微控制器进行内部程序的更新的技术(注意这完全有别于ICP或者ISP技术)。 ICP(In-Circuit Programming)技
[单片机]
<font color='red'>STM32F103</font>实现IAP在线升级应用程序
STM32F103RBT6程序下载设置
STM32F103RBT6下载程序要设置BOOT0 BOOT1引脚。 可选的下载方式为:ISP串口下载,JTAG下载,SWD下载。 ISP串口下载: BOOT0=1,BOOT1=0,使用串口下载程序。 JTAG下载: BOOT0=0,BOOT1=0,使用JTAG接口下载,使用较多的IO。 SWD下载: BOOT0=0,BOOT1=0,使用SWD下载,占用较少的IO(2个IO)。 下载说明: ISP下载使用MCUISP软件下载,最好是先复位STM32再下载程序,或者软件先点击下载编程,然后按下复位按键。 不过ISP下载之后按下STM32的复位按键并不能复位STM32,如果想要复位STM32系统就更改B
[单片机]
使用stm32f103c8实现一个简单的运动会计时器
首先是构思的思维导图 可以看到,我用到了按键结合中断作为输入,使用定时中断来计数,同时显示使用的是oled屏幕,大小为128*64个像素点。 屏幕图片源水印淘宝店( ̄▽ ̄) ok开始第一步,配置管脚图 oled管脚*7,一个3v3,一个GND,还有五个GPIO输出。 这边用的是串行通信的方法,各个管脚功能分别是 CS:OLED 片选信号。 RST(RES):硬复位 OLED。 DC:命令/数据标志(0,读写命令;1,读写数据)。 SCLK:串行时钟线。在 4 线串行模式下,D0 信号线作为串行时钟线 SCLK。 SDIN:串行数据线。在 4 线串行模式下,D1 信号线作为串行数据线 SDIN。 oled管脚: CS~PA0
[单片机]
使用<font color='red'>stm32f103</font>c8实现一个简单的运动会计时器
STM32F103C8T6驱动WS2812b灯条
几天小朋友到别人家玩,看上了人家的金鱼,人家就给了她一条小金鱼,有了小金鱼,怕它没氧气挂掉,买了一个氧气泵,没有东西喂它也不行,又买了一包鱼料,又因为它太孤单了,又买了几条小金鱼给它做伴,几条小金鱼老是在水桶里不怎么好看,又去买了个鱼缸,有了鱼缸太单调了,也不太好看,想了想加点灯光,后来找出吃灰多年的老灯条——WS2812b。 这个灯条以前使用新唐的N76E0003单片机驱动过,这款单片机是51内核的,之前驱动也没什么问题,今天使用stm32f103c8tc6来驱动,有了新的发现,首先来说一下ws2812b的驱动原理,直接上图好了。 驱动它很简单,驱动一个灯的话,给它发24位数据就行了。 新发现是:stm32f103是72M
[单片机]
<font color='red'>STM32F103</font>C8T6驱动WS2812b灯条
STM32F103x 485通信
一、485通信模块选型 1.1 模块型号 单片机TTL转RS485模块 485转串口UART电平互转 硬件自动控制流向 购买网址: https://item.taobao.com/item.htm?spm=a230r.1.14.95.462418200wPGRW&id=558153026325&ns=1&abbucket=11#detail 1.2 模块简介 1) 美信公司产品,一颗芯片485和自动流向控制,芯片内部集成自动流向控制,非外接流向控制芯片,使用的绝.非相对低廉的MAX485芯片加外置流向控制方案。 2) 具有1/4单位负载的接收器输入阻抗,支持多机通讯,允许接在最多128个设备的总线上。 3) 每个模
[单片机]
<font color='red'>STM32F103</font>x 485通信
新一代嵌入式微处理器STM32F103开发与应用
  基于Co rtex- M3内核的STM 32F103系列芯片是新型的32位嵌入式微处理器, 它是不需操作系统的ARM, 其性能远高于51系列单片机   单片机是单片微型计算机(Single-Chip Microcomputer)的简称,是一种将中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)采用超大规模集成电路技术集成到一块硅片上构成的微型计算机系统。 , 但开发过程与51系列单片机一样简便, 因而在很多应用场合可替代51系列单片机。本文从STM 32F103系列芯片性能特点和片上资源入手, 重点介绍其
[单片机]
新一代嵌入式微处理器<font color='red'>STM32F103</font>开发与应用
STM32CubeIDE下配置STM32F103输出带死区的互补PWM波
STM32F103的TIM1和TIM8是高级定时器,可以产生嵌入死区时间的互补PWM波,使用STM32CubeIDE完成相关配置,可以直接生成代码,输出带死区的PWM波。 根据项目需要,单片机需输出频率为36kHz,占空比50%,死区时间500ns的互补PWM波,下面使用STM32CubeIDE完成相关配置。 1、选择时钟源,这里选择外部石英晶体作为HSE时钟源 2、配置系统时钟为72MHz,高级定时器TIM1和TIM8时钟由APB2提供,这里APB2等于系统时钟72MHz 3、这里使用TIM1来产生互补PWM波,TIM1复用功能如下表所示: 我们使用单片机的PA7和PA8引脚作为PWM互补输出的两个通道,在S
[单片机]
STM32CubeIDE下配置<font color='red'>STM32F103</font>输出带死区的互补PWM波
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved