STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发

这篇具有很好参考价值的文章主要介绍了STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基础概念

1、FreeRTOS

RTOS是一类操作系统,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS 类的操作系统

FreeRTOS 是众多RTOS 类操作系统中的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,FreeRTOS 也不仅仅局限于在微控制器中使用。就单从文件数量上来看FreeRTOS 要比µC/OS 少得多。

RTOS是实时操作系统,例如汽车的操控:必须要在规定时间内完成响应。我们日常使用的Windows、IOS、Android等都是非实时操作系统,这些系统对任务响应时间没有严格要求,例如网页打开时可能会很久或者直接闪退等。

RTOS的最大特征就是“实时性”。所有实时操作系统中都要包含一个实时任务调度器,这个任务调度器与其它操作系统的最大不同是强调严格按照优先级来分配CPU时间。

FreeRTOS 操作系统是一个功能强大的RTOS 操作系统,并且能够根据需求进行功能裁剪,
以满足各种环境的要求、高效、开源、免费。

2、单片机编程的系统概念

a、裸机系统,包括轮询系统(不包括中断)和前后台系统(中断为前台,轮询为后台)
在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序里面标记事件,如果事件要处理的事情很简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回到后台程序里面处理。虽然事件的响应和处理是分开了,但是事件的处理还是在后台里面顺序执行的,但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力。在大多数的中小型项目中,前后台系统运用的好,堪称有操作系统的效果。

b、多任务系统
相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。在多任务系统中, 任务跟中断一样,也具有优先级,优先级高的任务会被优先执行。当一个紧急的事件在中断被标记之后,如果事件对应的任务的优先级足够高,就会立马得到响应。相比前后台系统,多任务系统的实时性又被提高了。

在裸机系统中,程序的主体是 CPU 按照顺序执行的。而在多任务系统中, 任务的执行是由系统调度的。

3、FreeRTOS编程风格


数据类型
在 FreeRTOS 中, 使用的数据类型虽然都是标准 C 里面的数据类型,但是针对不同的处理器,对标准 C 的数据类型又进行了重定义,给它们取了一个新的名字, 比如 char 重新定义了一个名字 portCHAR, 这里面的 port 表示接口的意思,就是 FreeRTOS 要移植到这些处理器上需要这些接口文件来把它们连接在一起。但是用户在写程序的时候并非一定要遵循 FreeRTOS 的风格, 我们还是可以直接用 C 语言的标准类型。在 FreeRTOS 中, int 型从不使用, 只使用 short 和 long型。 在 Cortex-M 内核的 MCU 中, short 为 16 位, long 为 32位。

FreeRTOS 中详细的数据类型重定义在 portmacro.h 这个头文件中实现

stm32 hal vs freertos,stm32开发,stm32,嵌入式硬件,单片机

二、Cubemx创建工程

1.创建任务

stm32 hal vs freertos,stm32开发,stm32,嵌入式硬件,单片机

stm32 hal vs freertos,stm32开发,stm32,嵌入式硬件,单片机

任务名 执行任务的名称
优先级 类似于中断优先级,共7个等级
栈空间 根据自己需要的空间决定占空间大小
进入函数名 任务要执行的函数名,cubemx自动生成
任务类型 有静态生成和动态生成,初学者默认就好

 文章来源地址https://www.toymoban.com/news/detail-831797.html

2.创建队列

stm32 hal vs freertos,stm32开发,stm32,嵌入式硬件,单片机

队列名 队列的名称
队列长度 队列的长度,根据自己需要设定
队列元素类型 队列所存储的数据类型,根据自己需要设定

 

3.创建信号量和互斥量

stm32 hal vs freertos,stm32开发,stm32,嵌入式硬件,单片机stm32 hal vs freertos,stm32开发,stm32,嵌入式硬件,单片机

4.时钟源设置

当使用了FreeRtos的时候,强烈建议HAL库使用除了Systick以外的时钟源。

防止在高优先级(优先级高于systick)中断服务中调用HAL_Delay(),导致中断服务忙等待,这样任何优先级低于该中断的中断都得不到服务。

把HAL库的时钟源设置为TIM1

stm32 hal vs freertos,stm32开发,stm32,嵌入式硬件,单片机

stm32 hal vs freertos,stm32开发,stm32,嵌入式硬件,单片机

以上步骤完成后,配置好自己需要使用的外设,就可以生成代码了。

三.简单的代码解析(请看注释)

1.main.h

int main(void)
{
 
  HAL_Init();


  SystemClock_Config();

  /*硬件初始化*/
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USB_Device_Init();
  MX_CRC_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_SPI3_Init();
  MX_SPI4_Init();
  MX_TIM4_Init();

  /* 调用任务初始化函数 */
  MX_FREERTOS_Init();

  /* 开启调度器 */
  osKernelStart();

  /* 任务调度器开启后,就不会进入while循环了,自己的应用代码在app_freertos.c中实现 */
  /* Infinite loop */

  while (1)
  {

  }

}

2.app_freertos.c

/*初始化函数*/
void MX_FREERTOS_Init(void) {


  /* 创建线程 */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* definition and creation of cpu */
  osThreadDef(cpu, cpuTask02, osPriorityIdle, 0, 128);
  cpuHandle = osThreadCreate(osThread(cpu), NULL);

  /* definition and creation of dataProceTask */
  osThreadDef(dataProceTask, dataProce, osPriorityIdle, 0, 128);
  dataProceTaskHandle = osThreadCreate(osThread(dataProceTask), NULL);



}


/*线程函数1,在这里实现自己的功能,注意任务优先级和栈空间!!!!!!!!!!!*/
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

/*线程函数2,在这里实现自己的功能,注意任务优先级和栈空间!!!!!!!!!!!*/
void cpuTask02(void const * argument)
{
  /* USER CODE BEGIN cpuTask02 */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END cpuTask02 */
}

/*线程函数3,在这里实现自己的功能,注意任务优先级和栈空间!!!!!!!!!!!*/
void dataProce(void const * argument)
{
  /* USER CODE BEGIN dataProce */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END dataProce */
}

作者水平有限,欢迎提出意见,进行指正。

 

到了这里,关于STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32CUBEMX,HAL库蓝牙通信

    1.准备工作 蓝牙模块HC-05模块 安卓APP软件 HC-05蓝牙模块支持AT指令。要进入AT指令模式,需要先按住蓝牙模块上的按键,接通电源,当模块上的LED灯进入慢闪后再松开按键,此时已经进入AT指令模式,可以进行AT指令设置1。 常用的AT指令包括: AT+VERSION? 返回HC-05的软件版本号

    2024年02月08日
    浏览(43)
  • STM32基于CubeMX与HAL库的I2C应用

    1.1 物理层         I2C协议和摩托罗拉公司的SPI协议一样,是一种通讯协议。串行外围设备接口,是一种高速全双工的通信总线,是由 Phiilps 公司开发的。由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内

    2024年02月21日
    浏览(27)
  • STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx

    本文主要讲解定时器触发ADC去采集交流信号,DMA把数据搬移到内存。 所需工具: 开发板:STM32F103C8T6 STM32CubeMX IDE: Keil-MDK 相关文章: STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx(二) STM32cubemx ADC+TIM+DMA超频采样 ADC+TIM+DMA采集交流信号是电赛中使用范围最为广泛的一个技术。这个模

    2024年02月03日
    浏览(20)
  • 简单介绍STM32上的FreeRTOS实时操作系统

    FreeRTOS是一款广泛使用的开源实时操作系统(RTOS),它为嵌入式系统提供了可靠的任务调度和并发管理。在嵌入式领域中,STM32微控制器广受欢迎,并且与FreeRTOS的结合使用可以提供强大的功能和灵活性。在本篇博客中,我们将深入探究STM32上的FreeRTOS,并了解其核心概念、任

    2024年02月16日
    浏览(24)
  • STM32-03基于HAL库(CubeMX+MDK+Proteus)输入检测案例(按键控制LED)

    搭建完成开发STM32开发环境之后,开始GPIO的学习。上一节已经测试了使用GPIO的输出模式,实现LED点亮的功能。 本次案例实现GPIO的输入检测功能,实现按键状态检测,通过按键状态控制LED。 需求分析: 接线:PA6-KEY1、PA7-KEY2、PA0-LED1、PA1-LED2; KEY1控制LED1、KEY2控制LED2; 按键闭

    2024年04月23日
    浏览(25)
  • STM32初学者入门FreeRTOS操作系统,多任务实时系统

            FreeRTOS(Free Real-Time Operating System)是一个开源的嵌入式实时操作系统,它专门设计用于在资源有限的嵌入式系统中运行。FreeRTOS提供了一些用于任务管理、调度、同步和通信的功能,使开发者能够轻松地创建可靠的嵌入式系统。 以下是FreeRTOS的一些特点和功能: 轻量

    2024年02月11日
    浏览(20)
  • 【STM32】HAL库-以太网外设-LAN8720A-LWIP-无操作系统

    KEIL:MDK_ARM_5.27 MCU:STM32F429IGT6 PHY_IC:LAN8720A LWIP:LWIP2.1.2 STM32CUBEMX:6.6.1 HAL:V1.27.1 LAN8720A使用RMII接口与STM32的ETH外设进行数据通信 STM32使用SMI接口读/写LAN8720A的寄存器 LAN8720A由外部25MHz晶振提供时钟,LED2/NINTSEL引脚配置为下拉,故PHY(LAN8720A)提供50MHz时钟给RMII的NINT/REFCLKO(此时引脚

    2024年02月08日
    浏览(23)
  • 基于CubeMX(hal库)stm32中hrtim高分辨率定时器的基本使用(自存)

    1、选通道 单通道输出or双通道输出 2、Timer A~F配置 (Master Timer不用管) 比较值Compare 个人感觉跟CCR差不多的意思, 注意不要大于上面的Period就行 设置上升沿和下降沿时间: 若想让上设Compare=CCR 如图设置 即可 即在 计数到Compare1时拉低,计数溢出时拉高 所以上图输出频率10kHz占

    2024年02月04日
    浏览(25)
  • 2.基于正点原子STM32F103的定时器中断实验(HAL库实现)(cubeMX)

      基本上每一款MCU都会配备定时器这个外设,STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 同样,STM32F1系列的定时器功能也很强大,包括: TIM1和TIM8两个高级定时器; TIM2~TIM5是个通用寄存器; TIM7,TIM8,两个基本定时器。 由于本次实验适用于新手入门

    2023年04月26日
    浏览(139)
  • Stm32点亮LED灯(HAL库和标准库)

            日常生活中我们要点亮房间的灯,就是按开关。背后的本质,用初中物理的话说就是两个要素:形成闭合回路;给用电器电压。         单片机就是一个小型的集成电路,LED作为电路中的用电器也需要这两个要素。需要注意的是,发光二极管具有单向导通性,

    2024年02月20日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包