当前位置:   article > 正文

FreeRTOS学习笔记(一) —— 环境搭建_zynq平台freertos开发环境

zynq平台freertos开发环境

前言

在日常中,我平常都是直接裸机开发,去完成一些小玩意。直到最近,功能需求的不断增加,导致裸机开发的缺点就暴露出来了,中断内的处理变得复杂,处理时间变长,超级循环使得应用程序变得非常复杂,因此难以扩展、中断嵌套由于运行时长增加的原因,导致发生不可预估的问题等等…

为了解决以上痛点,我想到了FreeRTOS(一个开源的嵌入式实时操作系统),刚好ST官方的STM32CubeMX里面直接有FreeRTOS的中间件,使用非常方便。下来就来看看怎么搭建环境叭~

推荐去FreeRTOS官网学习相关API =>传送门.

CubeMx配置

MCU: STM32F103C8T6
CubeMX: STM32CubeMX 5.3.0

1.使能外部高速时钟源
在这里插入图片描述
2.时钟树配置(直接最大频率)
在这里插入图片描述
3.开启串口(用于调试)
在这里插入图片描述
4.开启今天的主角FreeRTOS
在这里插入图片描述
然后在Tasks and Queues选项中再添加一个Tasks,默认有一个,添加之后就是有两个了。Queues是消息队列,在FreeRTOS中是非常重要的功能,现在暂时用不到,后面再详谈。
在这里插入图片描述
5.填写项目名
在这里插入图片描述
配置项目生成单独的.c/.h文件
在这里插入图片描述
接着生成代码就ok了~ (点击后会出现警告,直接点yes即可)
在这里插入图片描述

修改工程文件

1.在usart.c文件下添加以下代码

/* USER CODE BEGIN 1 */
void Usart_SendString(uint8_t *str)
{
	unsigned int k=0;
  do 
  {
      HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);
      k++;
  } while(*(str + k)!='\0');
  
}
//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口DEBUG_USART */
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);	
	
	return (ch);
}

//重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{		
	int ch;
	HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);	
	return (ch);
}
/* USER CODE END 1 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

然后记得加上头文件 include <stdio.h> 不然会有黄色感叹号

2.去到freertos.c编写测试代码

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used 
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
	printf("任务1\r\n");
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
	printf("任务2\r\n");
    osDelay(1);
  }
  /* USER CODE END StartTask02 */
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

编写完毕后,就可以烧写到板子上,然后用ttl转串口模块就可以看到效果了。
在这里插入图片描述

总结

根据上图很容易得知,在FreeRTOS下,同等优先级级别的Task,他们的执行顺序是从头开始,一直循环。
  • 1

FreeRTOS最基本的环境到这里已经搭建完成了,关于FreeRTOS的内容还有很多,后续会补充~

以上内容记录下来,希望能帮助到有需要的伙伴。
该文章如有不对地地方,欢迎指出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/770802
推荐阅读
相关标签
  

闽ICP备14008679号