STM32CubeIDE+FreeRTOS任务管理实验

摘要:
Task03等待3秒挂起Task02,在等待3秒回复Task02.程序刚运行时,DefaultTask和Task02同频率输出,3秒钟之后DefaultTask继续输出,而Task02不再输出。再等待3秒,Task03将Task02恢复,Task02继续输出,如此循环。

新建工程RTOS_Task,配置如下:

STM32CubeIDE+FreeRTOS任务管理实验第1张STM32CubeIDE+FreeRTOS任务管理实验第2张

Ctrl + S生成代码

修改代码,

1,在main.h中添加

//添加include/*Private includes ----------------------------------------------------------*/
/*USER CODE BEGIN Includes */#include "stdio.h"
/*USER CODE END Includes */

2,在main.c中添加

//添加_write函数重定义/*USER CODE BEGIN PFP */
int _write(int file , char *ptr,intlen)
{
    int i = 0;
    for(i = 0;i<len;i++)
        ITM_SendChar((*ptr++));
    returnlen;
}
/*USER CODE END PFP */...
...
...
/*USER CODE BEGIN 2 */printf("starting...
");
/*USER CODE END 2 */

3,在main.c中修改3个任务入口函数的内容

/*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 5 */
    int timeCount = 0;
  /*Infinite loop */
  for(;;)
  {
    printf("DefaultTask----time   %d
",timeCount++);
    osDelay(1000);
  }
  /*USER CODE END 5 */}
/*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 */
    int times = 0;
  /*Infinite loop */
  for(;;)
  {
    printf("Task02----times   %d
",times++);
    osDelay(1000);
  }
  /*USER CODE END StartTask02 */}
/*USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the myTask03 thread.
* @param argument: Not used
* @retval None
*/
/*USER CODE END Header_StartTask03 */
void StartTask03(void const *argument)
{
  /*USER CODE BEGIN StartTask03 */
  /*Infinite loop */
  for(;;)
  {
    osDelay(3000);//等待3秒
osThreadSuspend(myTask02Handle);//挂起线程Task02
osDelay(3000);//等待3秒
osThreadResume(myTask02Handle);//恢复线程Task02
}
  /*USER CODE END StartTask03 */}

修改完毕后点击 小锤子 构建工程,然后点击Debug,按如下步骤配置ITM调试

STM32CubeIDE+FreeRTOS任务管理实验第3张

STM32CubeIDE+FreeRTOS任务管理实验第4张

STM32CubeIDE+FreeRTOS任务管理实验第5张

全速运行之前一定要先点击SWV ITM data Console 页面中的红色圆圈

STM32CubeIDE+FreeRTOS任务管理实验第6张

现象:

STM32CubeIDE+FreeRTOS任务管理实验第7张

分析:

DefaultTask 负责每秒输出一个当前的时间信息,表示此时时间为第几秒

Task02每秒输出一次,表示此次为第几次输出。

Task03等待3秒挂起Task02,在等待3秒回复Task02.

程序刚运行时,DefaultTask 和 Task02同频率输出,3秒钟之后DefaultTask继续输出,而Task02不再输出。

再等待3秒,Task03将Task02 恢复,Task02 继续输出,如此循环。

此次实现了任务的挂起与恢复。

免责声明:文章转载自《STM32CubeIDE+FreeRTOS任务管理实验》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WinForm中显示PDF文件vue,react项目中使用webpack打包中直接打包成压缩包的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ClientDataSet控件ApplyUpdates的异常触发

在使用ClientDataSet控件时,在关联的TDBGrid控件插入不合法的字段,再执行ClientDataSet的ApplyUpdates方法,数据插入失败 但在客户端没有报异常,try...except...end 无法捕捉到。 在网上找到了几种解决方法 第一种是在中间服务层的DataSetProvider控件中加入OnUpdateError事件 在...

C++之迭代器

迭代器的概念 迭代器是用来访问string对象或vector对象的元素的,类似于下标运算和指针。 其对象是容器中的元素或string对象中的字符; 使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。 迭代器的使用 不同于指针,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员; 比如,这些类型拥有名为begin和end的成...

delphi各种用法

调用外部程序,等待外部程序运行完成,相当于Showmodal功能,呵呵 delphi代码1.function WinExecAndWait32(FileName: string; Visibility: Boolean): integer;   2.var  3.  zAppName: array[0..512] of char; //存放应用程序名  4...

DELPHI事务

--测试环境createtable table1(id intprimarykey)insert table1 select1union  all    select2--查看表select*from table1--操作A(执行错误后,事务没有回滚)begintrandeleteFrom table1 where id=1Insertinto A(Fie...

sql 事务和回滚

(1) set ANSI_NULLS ON --见图1 set QUOTED_IDENTIFIER ON go ALTER proc [dbo].[procname] as begin begin transaction DECLARE @myerror INT set @myerror=0 delete from...

字符串(二):string

字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string string 是 C++ STL 的一个字符串类型,原型是 vector<char> 并对字符串处理做了优化。 1. 声明 首先要包括库文件 #include <string>,这个 <string> 不同于 <cstr...