单片机_RTOS_架构

news/2024/4/17 17:36:34

一. RTOS的概念

// 经典单片机程序
void main()
{while (1){喂一口饭();回一个信息();}
}
------------------------------------------------------
// RTOS程序    
喂饭()
{while (1){喂一口饭();}
}回信息()
{while (1){回一个信息();}
}void main()
{create_task(喂饭);create_task(回信息);start_scheduler();while (1){sleep();}
}

二.FreeRTOS目录结构

三.从官方源码裁剪

1. 下载

2. 删减目录

3. 编译、执行

4. 添加串口打印功能

  • 去掉无关的代码:LCD等

  • 增加串口打印功能

    • 初始化串口

    • 实现fputc

四. 创建任务

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数const char * const pcName, // 任务的名字const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters, // 调用任务函数时传入的参数UBaseType_t uxPriority, // 优先级TaskHandle_t * const pxCreatedTask // 任务句柄, 以后使用它来操作这个任务); 

1.创建第一个任务 

void Task1Function(void*param)//函数指针
{while(1){printf("1");}
}/*-----------------------------------------------------------*/int main( void )
{TaskHandle_t xHandleTask1;
#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("hello,world,nimade!\r\n");xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);//创建任务/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

不断的执行1 

2.创建第二个任务 

void Task1Function(void*param)
{while(1){printf("1");}
}
void Task2Function(void*param)
{while(1){printf("2");}
}
/*-----------------------------------------------------------*/int main( void )
{TaskHandle_t xHandleTask1;
#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("hello,world,nimade!\r\n");xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);//这里没有加句柄/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

3.动态内存的使用 

        TCB_t * pxNewTCB;//任务控制块BaseType_t xReturn;

对于每一个任务都有一个TCB_t 结构体,对于这个结构体可以使用动态分配也可以静态分配。动态分配在程序里面使用 xTaskCreate();

    TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */const uint32_t ulStackDepth,void * const pvParameters,UBaseType_t uxPriority,StackType_t * const puxStackBuffer,StaticTask_t * const pxTaskBuffer ){
void Task1Function(void*param)
{while(1){printf("1");}
}
void Task2Function(void*param)
{while(1){printf("2");}
}
void Task4Function(void*param)
{while(1){     printf("3");}
}/*-----------------------------------------------------------*/
StackType_t xTask4Stack[100];//100*4字节
StaticTask_t xTask4TCB;StackType_t xIdleTaskStack[100];//100*4字节
StaticTask_t xIdleTaskTCB;void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;*ppxIdleTaskStackBuffer = xIdleTaskStack;*pulIdleTaskStackSize = 100;
}int main( void )
{LED_Init();TaskHandle_t xHandleTask1;
#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("hello,world,nimade!\r\n");xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);xTaskCreateStatic(Task4Function,"Task4",100,NULL,1,xTask4Stack,&xTask4TCB);/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}


https://www.xjx100.cn/news/3118926.html

相关文章

Linux多线程同步

Linux多线程同步 1、线程同步的概念1.1 为什么要同步1.2 同步方式 2、互斥锁2.1 互斥锁函数2.2 互斥锁使用 3、死锁4、读写锁4.1 读写锁函数4.2 读写锁使用 5、条件变量5.1 条件变量函数5.2 生产者和消费者 6、信号量6.1 信号量函数6.2 生产者和消费者6.3 信号量的使用6.3.1 总…

原神:夏洛蒂是否值得培养?全队瞬抬治疗量不输五星,但缺点也很明显

作为四星冰系治疗角色,夏洛蒂的实战表现可以说相当让人惊喜。不仅有相当有意思的普攻动作以及技能特效,而且她还有治疗和挂冰等功能性。下面就来详细聊聊夏洛蒂是否值得培养。 【治疗量让人惊喜,但也有缺点】 说实话,在使用夏洛蒂…

智能化质量控制,三坐标尺寸SPC管理系统引领制造新潮流!

在制造业的浪潮中,提升产品质量一直是企业不懈追求的目标。为了更好地适应市场需求、提高生产效益,我们自豪地介绍全新的三坐标尺寸SPC(统计过程控制)管理系统,为您的企业带来智能、高效的质量管理体验,助力…

hadoop操作

文件操作 注意当前所在的路径,创建一个mytest文件夹 创建一个1.txt文件 将1.txt文件移动到mytest中,通过mv改名字,然后查看mytest文件夹的txt文件变成了test.txt 删除文件 上传下载文件 新建1.txt 然后编辑它 随便输入什么 上传 然后看看网…

【从删库到跑路 | MySQL总结篇】表的增删查改(进阶下)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、联合…

探究C语言中的分支和循环语句

C语言是一种广泛应用的编程语言,其强大的分支和循环语句为程序员提供了灵活性和控制流。在本文中,我们将深入探讨C语言中的分支和循环语句,以及它们在编程中的重要性和应用。 分支语句: 在C语言中,分支语句主要包括if语…

Qt MVC示例 simpletreemodel 树模型

Qt MVC示例 simpletreemodel 树模型 从文本中读取树模型数据&#xff0c;缩进代表子项 TreeItem 表示一行字符串数据 treeitem.h #ifndef TREEITEM_H #define TREEITEM_H#include <QList> #include <QVariant>//! [0] class TreeItem { public:explicit Tree…

48、Flink DataStream API 编程指南(1)- DataStream 入门示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…