stm32程序运行多个程序

stm32程序运行多个程序,第1张

在STM32中,可以使用多任务 *** 作系统(RTOS)来运行多个程序。常见的RTOS包括FreeRTOS、uC/OS和RTX等。这些RTOS提供了多任务调度、同步和通信机制,使得多个程序可以并行运行,从而提高系统的效率和可靠性。

使用RTOS需要在STM32上添加RTOS的库文件,并进行配置。然后在代码创建多个任务并定义它们的优先级,RTOS会自动进行任务调度,让它们并行运行。下面是一个简单的示例代码:

```c

#include "FreeRTOS.h"

#include "task.h"

void task1(void *pvParameters) {

while (1) {

// task1的代码

}

}

void task2(void *pvParameters) {

while (1) {

// task2的代码

}

}

int main(void) {

// 初始化RTOS

xTaskCreate(task1, "Task 1", configMINIMAL_STACK_SIZE, NULL, 1, NULL)

xTaskCreate(task2, "Task 2", configMINIMAL_STACK_SIZE, NULL, 2, NULL)

vTaskStartScheduler()

while (1) {

// 主循环的代码

}

}

```

在上面的示例中,创建了两个任务task1和task2,并分别定义了它们的优先级为1和2。然后调用了vTaskStartScheduler()函数启动RTOS的调度器,让它自动进行任务调度。最后在主循环中添加其他的代码。

需要注意的是,在RTOS中,所有任务都必须是无限循环的,否则任务执行完后会自动被删除。因此,任务的代码中应该始终包含一个无限循环语句。

1.前言

【1】其实说不上移植笔记,FreeRTOS已经移植至众多平台(MCU),包括MSP430,STM32等,这份笔记完全建立在官方代码的基础之上,简单的说就是修改一些设置从而完成一个呼吸灯实验。

【2】虽然有官方移植代码,但是官方移植版本为STM32的V2.X库,与现在流行的V3.5有比较大的区别。本笔记也是总结网上几篇学习笔记,主要说明如果使用V3.5库,需要做哪些修改。

【3】编译软件为IAR EWARM 6.5。

【相关博文】

【FreeRTOS学习笔记——任务间使用队列同步数据】——如何使用FreeRTOS队列。

【如何在FreeRTOS下实现低功耗——MSP430F5438平台】——如何通过空任务实现系统低功耗。

2.FreeRTOS需要哪些文件

FreeRTOS的文件结构非常简单,移植或者版本升级替换也非常方便。

1)与FreeRTOS内核有关的文件数量仅为3个,分别是list.c queue.c tasks.c

该文件位于FreeRTOS\Source

2)与内存分配有关的文件共有4个,分别是heap_1.c,heap_2.c,heap_3.c,heap_4.c。4个文件只需选择其中的1个,STM32选择heap_2.c。

该文件位于FreeRTOS\Source\portable\MemMang

3)与移植相关的代码包括port.c,portasm.s,portmacro.h。这些代码不但和编译器有关还和平台(MCU)有关。FreeRTOS先以编译器为大类,然后再以平台(MCU)为小类。在这里选择IAR编译器,平台为ARM_CM3。

该文件位于FreeRTOS\Source\portable\IAR\ARM_CM3

4)除了上述内容之外,还包括FreeRTOS内核相关的头文件。

该文件FreeRTOS\Source\include

3.必要的工程设置

开始之前需要引入V3.5库相关头文件,启动代码和CMSIS库。

在IAR中设置相关头文件的路径(应根据实际情况修改)

$PROJ_DIR$\CMSIS

$PROJ_DIR$\StdPeriph_Driver\inc

$PROJ_DIR$\User

$PROJ_DIR$\FreeRTOS\Source\include

$PROJ_DIR$\FreeRTOS\Source\portable\IAR\ARM_CM3

当然头文件的路径并不是绝对的,只要明确头文件在哪,设置正确路径即可。

除了设置C代码的相关头文件之外,还需要设置汇编代码的头文件路径,由于很少设置汇编代码头文件路径,往往初次移植FreeRTOS会在此处遇到一些“困难”。

我第一次使用STM32CubeMx,创建了一个简单的FreeRTOS代码。硬件平台是STM32F103RCT6。根据原代码,在freertos.c文件内的函数 MX_FREERTOS_Init(void)内,调用osThreadCreate创建线程,默认生成的StartDefaultTask线程。我按照StartDefaultTask的代码,在 MX_FREERTOS_Init(void)内用osThreadCreate创建另外两个线程,分别为LEDTask和MeasureTempTask。

当三个线程同时创建的话,OS跑不起来,连StartDefaultTask都没有执行。

如果,只创建其中任意的两个线程,OS就可以跑起来。

FreeRTOS本身可以执行多个线程,但STM32CubeMx好像是用CMSIS来重新封装FreeRTOS,是不是CMSIS限制了执行线程的数量?

另外,我测试过,如果在StartDefaultTask线程内,创建另外的两个线程,OS除了执行StartDefaultTask线程外,只执行另外创建的第一个线程。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11738810.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存