历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

2019年07月26日 | 在STM32CubeMX生成的工程中增加并编译RTX5源码

2019-07-26 来源:eefocus

前言:

STM32CubeMX是意法推出的基于STM32的一款强大的可视化开发软件,在常规的产品开发中,可以结合可视化的硬件配置来完成系统平台的初始化配置,选用一些中间软件包,如OS,FS等。

RTX5是Keil公司打造的一款轻量型,实时,低延迟,高可靠,安全的操作系统,MDK开发环境本身集成了RTX5软件包。但STM32CubeMX中不包含RTX5组件包,并不支持RTX5组件包,这需要在STM32CubeMXb生成的工程文件中手动添加RTX5软件包,下面详细阐述该过程,并对其中的编译错误的更正过程进行了的说明。


开发环境:

MDK 5.25

STM32CubeMX 4.25

STM32CubeMX STM32F4 组件包版本为1.21.0

RTX5 5.3.0

一. 在STM32CubeMX生成的工程中添加RTX5源码

1. 打开STM32CubeMX工程

如果中间件FreeRTOS被勾选,要勾选掉,防止两个操作系统同时存在:


2. 生成MDK工程代码

在STM32CubeMX,生成并打开MDK工程代码。

在MDK的工程Options for target ...的Output选显卡中,勾选掉默认的选项"Browse Iniormation",这样可以加快编译速度,否则编译会非常耗时。


3. 增加RTX5软件组件:

添加RTOS2-->Keil RTX5,这里为5.3.0版本(单击图片可放大):

如提示出现“Validation Output",点击信息框下面的"Resolve"。

有两种添加RTX5的方式:库和源代码。这里重点说明如何对添加的RTX5源码进行工程编译,所以这里选择"Source"。

上图 “Keil RTX5”对应的右侧栏目选择"Source",然后点击"Resolve"。


二. 工程编译错误的解决

1. "Unknown Arm Architecture!"错误

尝试工程编译,会提示如下的编译错误:

error:  #35: #error directive: "Unknown Arm Architecture!"


删除工程目录DriversCMSISInclude下的cmsis_armcc.h

这样工程会使用C:Keil_v5ARMPACKARMCMSIS5.3.0CMSISIncludecmsis_armcc.h

后一个文件的文件头代码如下:

#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)

  #error "Please use Arm Compiler Toolchain V4.0.677 or later!"

#endif

/* CMSIS compiler control architecture macros */

#if ((defined (__TARGET_ARCH_6_M  ) && (__TARGET_ARCH_6_M   == 1)) ||

     (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M  == 1))   )

  #define __ARM_ARCH_6M__           1

#endif

#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M  == 1))

  #define __ARM_ARCH_7M__           1

#endif

#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))

  #define __ARM_ARCH_7EM__          1

#endif

  /* __ARM_ARCH_8M_BASE__  not applicable */

  /* __ARM_ARCH_8M_MAIN__  not applicable */

/* CMSIS compiler specific defines */

#ifndef   __ASM

  #define __ASM                                  __asm

#endif

#ifndef   __INLINE

  #define __INLINE                               __inline

#endif

#ifndef   __STATIC_INLINE

  #define __STATIC_INLINE                        static __inline

#endif

#ifndef   __STATIC_FORCEINLINE                

  #define __STATIC_FORCEINLINE                   static __forceinline

#endif          

#ifndef   __NO_RETURN

  #define __NO_RETURN                            __declspec(noreturn)

#endif

#ifndef   __USED

  #define __USED                                 __attribute__((used))

#endif

#ifndef   __WEAK

  #define __WEAK                                 __attribute__((weak))

#endif

...

而在STM32CubeMX生成的DriversCMSISInclude下的cmsis_armcc.h的文件中并无这些宏定义。

特别,如下宏定义分支有效:

#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M  == 1))

  #define __ARM_ARCH_7M__           1

#endif


2. 代码重复冲突错误

再次编译,会出现如下错误:

error: L6235E: More than one section matches selector - cannot all be FIRST/LAST.

这是由于STM32CubeMX生成的工程所包含的启动文件"startup_stm32f439xx.s"(Application/MDK-ARM工程文件夹下,见下图)中,已经存在RESET段。这和RTX5的启动文件"startup_stm32f439xx.s"(Deviece工程文件夹下,见下图)中的代码相冲突:


将Application/MDK-ARM工程文件夹下的"startup_stm32f439xx.s"文件排除在编译之外:

右键点击Application/MDK-ARM工程文件夹下的文件"startup_stm32f439xx.s",

选中“Options for startup_stm32f439xx.s”菜单,弹出(单击图片可放大):

勾选掉“include in Target Build",如上图(“include in Target Build"未勾选掉之前)。

编译工程,会出现如下错误:

Error: L6200E: Symbol SystemCoreClock multiply defined (by system_stm32f4xx_1.o and system_stm32f4xx.o).

Error: L6200E: Symbol AHBPrescTable multiply defined (by system_stm32f4xx_1.o and system_stm32f4xx.o).

Error: L6200E: Symbol APBPrescTable multiply defined (by system_stm32f4xx_1.o and system_stm32f4xx.o).

rror: L6200E: Symbol SVC_Handler multiply defined (by stm32f4xx_it.o and irq_cm4f.o).


同样的,这是由于STM32CubeMX生成的工程所包含的文件"system_stm32f4xx.c"(Drivers/CMSIS工程文件夹下,见下图)中,已经存在上面编译错误中的段。这和RTX5的文件"system_stm32f4xx.c"(Deviece工程文件夹下,见下图)中的代码相冲突:

将Drivers/CMSIS工程文件夹中的"system_stm32f4xx.c"排除在编译之外。


工程编译,会提示:

Error: L6200E: Symbol SVC_Handler multiply defined (by stm32f4xx_it.o and irq_cm4f.o).

Error: L6200E: Symbol PendSV_Handler multiply defined (by stm32f4xx_it.o and irq_cm4f.o).

Error: L6200E: Symbol SysTick_Handler multiply defined (by stm32f4xx_it.o and irq_cm4f.o).


同样的,将文件"stm32f4xx_it.c"排除在编译之外。


3.  RTX5示例演示

增加RTX5示例代码:

在"Application/MDK-ARM"列表上点击右键,在弹出的菜单中选中"Add New Item to Group 'Application/User'":

弹出对话框:

注意要防止这里的man.c文件存放路径和STM32CubeMX生成的main.c文件的路径相冲突。

在工程中排除掉"Application/User"下的main.c文件的编译。

最后的工程文件列表如下(红色框处的标注为排除在工程编译之外的文件):

编译工程,提示:

STM32F429_176STM32F429_176.axf: Error: L6218E: Undefined symbol _Error_Handler (referred from tim.o).

复制"Application/User"下的main.c中的_Error_Handler函数到新增的"Application/MDK-ARM"下的main.c文件中。


在main.c中新增任务,最后的代码如下:

/*----------------------------------------------------------------------------

 * Application main thread

  *---------------------------------------------------------------------------*/

void task1 (void *argument)

{

 

    // ...

    for (;;){

        osDelay(30);

    }

   

}

 

void task2 (void *argument)

{

 

    // ...

    for (;;){

        osDelay(20);

    }

   

}

 

int main (void) {

 

    // System Initialization

    SystemCoreClockUpdate();

    #ifdef RTE_Compiler_EventRecorder

        // Initialize and start Event Recorder

        EventRecorderInitialize(EventRecordError, 1U);

    #endif

    // ...

    osKernelInitialize();              // Initialize CMSIS-RTOS

    osThreadNew(task1, NULL, NULL);    // Create application main thread

    osThreadNew(task2, NULL, NULL);    // Create application main thread

    osKernelStart();                   // Start thread execution

    for (;;) {}

   

}


最后,在MDK的"Project"中,Clean Targets,再次全部编译。

注意,Clean Targets这一步是必须的,否则,调试启动时,无法跳转到最终所使用的main.c文件的main函数中。


工程示例代码:


https://pan.baidu.com/s/16_bsWqH3kbyfvMa6Bjm_Ww


推荐阅读

史海拾趣

意华(CZT)公司的发展小趣事

为了进一步扩大规模和提升竞争力,意华先后成立了多家子公司,包括苏州意华电工有限公司、东莞意兆电子科技有限公司等。这些子公司的成立,不仅实现了公司在不同地域的资源整合和优势互补,也加速了公司的集团化发展进程。通过集团化管理,意华能够更好地协调各子公司之间的业务和资源,提高整体运营效率。

BENCENT公司的发展小趣事

为了扩大市场份额和提高品牌知名度,BENCENT公司开始积极参与国内外各类电子展会和论坛,与潜在客户和合作伙伴建立联系。同时,公司还加大了营销宣传力度,通过线上线下的方式提升品牌曝光度。这些努力不仅带来了更多的销售机会,也提升了公司在行业内的地位和影响力。

BESTECH公司的发展小趣事

在取得一系列成绩的同时,BENCENT公司也始终关注可持续发展。公司注重环保和节能技术的研发和应用,致力于为客户提供更加环保、高效的电子产品。同时,公司还积极参与社会公益事业,回馈社会。展望未来,BENCENT公司将继续坚持创新驱动、质量为本的发展理念,不断推动电子行业的进步和发展。


请注意,这些故事仅为框架性的描述,并未包含具体的细节和数据。您可以根据BENCENT公司的实际情况和发展历程,对这些故事进行进一步的丰富和完善。同时,确保在描述事实时保持客观公正的态度,避免加入主观评价。

Acmelux Taiwan Inc公司的发展小趣事

Acmelux Taiwan Inc公司自成立以来,一直致力于电子技术的研发与创新。早期,公司凭借一款具有独特功能的半导体产品,成功打破了市场的固有格局,赢得了众多客户的青睐。随着技术的不断迭代,Acmelux逐渐在芯片设计、封装测试等领域取得了突破,成为行业内的技术领军者。公司通过持续的研发投入,不仅巩固了现有市场地位,还积极拓展新的应用领域,为公司的长远发展奠定了坚实基础。

Antelec公司的发展小趣事

为了确保产品质量的稳定性和可靠性,Antelec公司高度重视质量管理体系的建设。公司引入了国际先进的质量管理标准,建立了完善的质量管理体系,并不断加强员工的质量意识和技能培训。这些举措使得公司的产品质量得到了持续提升,赢得了客户的广泛认可。

GE Oil & Gas Digital Solutions公司的发展小趣事
检查电容和电阻元件是否有损坏或老化现象,检查电路布局是否合理以避免电磁干扰。

问答坊 | AI 解惑

关于FPGA开发板信息

伙计们: 作为FPGA初学者,或已经工作,但是接触机会不多,又想学好它的人来说,有一个开发板是不错的。 可是这些人一般不会了解哪个好,那个不好。那就请高手来介绍或者指导买哪家的了。 在此,也强烈建议论坛开展一个diyFPGA开发板的活动…

查看全部问答>

为什么我的按键中断在程序启动的时候总自动进入

为什么我的按键中断在程序启动的时候总自动进入,不是按下按键以后,而是程序一运行的时候就自动进入中断函数,请问这是什么原因呢?…

查看全部问答>

怎样从内存中读取摄像头采集的数据保存成bmp格式

我已经从把摄像头采集的数据保存使用 mmap 内存映射来获取了图像,当用write函数得出的是jpeg格式的 我想得到bmp格式的图片怎么做,跪求,急用。谢谢各位。 …

查看全部问答>

用verilog HDL 实现网络加密算法md5

用verilog HDL 实现一个网络加密的算法(md5),有没有哪位高手能给点帮助,我邮箱是poppy220@126.com 先谢过啦!^_^ …

查看全部问答>

关于STM32外设初始化时,时钟配置的列表

附件为在使用STM32外设,进行初始化时,各个外设需要对哪些时钟进行配置的列表。希望大家对该文件的内容多提意见,我们将对其进行修改,使得大家在使用STM32时有所帮助。 相关链接:https://bbs.eeworld.com.cn/upfiles/img/20093/200931217123 ...…

查看全部问答>

一个很莫名其妙的问题

最近刚刚开始接触STM32,今天调试串口的时候发现一个很无奈的问题,源代码基本都是使用keil自带的demo,就不列举了。修改以下这些设置:/* PLLCLK = 12MHz * 6= 72 MHz */     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6 ...…

查看全部问答>

9b96的EPI能同时连几个外设?

想扩展个NOR FLASH ,SDRAM,FPGA,想问下各位,能实现吗?我是说都用EPI连接?可是手册上说配EPI的模式不同,如何实现?谢谢。 如果用MCU到FPGA,再到SDRAM,,不就多此一举了吗, 如果用I2C的或者SPI的FLASH,程序是不是得先考到RAM里?  …

查看全部问答>

求指导

老师最近给了一个电动汽车电池管理系统(BMS)设计的方向,小弟有一点编程、数电、模电、fpga的基础。也看了一些BMS相关论文的论文,但始终不知道如何着手去做。 求高人指导,比如还应学习什么基础知识之类的…

查看全部问答>

秒计时器,求高帮忙

  u(一)功能简述 :   u 通过单片机系统实现秒表计时功能,可以进行暂停计时、恢复计时、设定时间和清零等操作。   u(二)设计要求 :   u系统上电,数码管显示“99”. u每隔1秒,数码管显示减1,减小到“00”后 ...…

查看全部问答>

一阶无源惯性低通滤波器的单片机实现

那位大虾帮忙下。。一阶无源惯性低通滤波器的单片机实现。。要求采用单片机采用离散化处理后,来实现滤波功能 不太懂。。。…

查看全部问答>