asp.net网站访问统计,7k网站怎么做,个人做网站被骗,百度爱采购个人主页~
这篇文章是我亲身经历的#xff0c;在做完一个项目之后总结的经验#xff0c;虽然我没有将整个项目给放出来#xff0c;因为这项目确实也是花了米让导师指导的#xff0c;但是这个过程对于STM32的实战项目开发都是非常好用的#xff0c;可以说按照这个过程在做完一个项目之后总结的经验虽然我没有将整个项目给放出来因为这项目确实也是花了米让导师指导的但是这个过程对于STM32的实战项目开发都是非常好用的可以说按照这个过程在你熟悉各种外设的前提下你可以不用受别人指导地进行一个项目甚至完成自己的一个作品 实战项目的实现过程 一、FreeRtos1、简介2、功能1裸机开发2基于Rtos的开发 3、格式1定义任务2定义空闲任务3main函数4开始任务函数 一、FreeRtos
1、简介
Rtos就是实时操作系统os的意思就像是我们常用的iOS、HamonyOS是一个意思就是操作系统的意思而FreeRtos就是免费的实时操作系统在嵌入式系统中非常常用
它的底层代码是用C语言写成的可移植性特别好且简单易用核心代码有9000多行
2、功能
1裸机开发
像STM32在开始学习的时候我们的程序是一个main函数里面的代码一行接着一行执行非常单一只要写好程序程序就会按照既定的顺序执行不会出现某一段代码先于前面几行的代码的情况也就是实时性差这叫做裸机开发也就是不带操作系统的开发它常用于不需要高实时性的场景的产品开发
在delay函数下的等待只能等待没有占用CPU的情况浪费资源
2基于Rtos的开发
Rtos有很多种除了FreeRtos以外我们可以在浏览器上搜索其他的Rtos但在所有嵌入式系统中FreeRtos是应用最多的
添加了Rtos的嵌入式系统实时性会提高我们可以将某些程序分为多个任务给予它们优先级优先级高的优先获得CPU使用权也就是一个优先级低的任务执行过程中优先级高的任务一旦出现需要执行的情况优先级低的任务立刻发生中断先让优先级高的任务完成然后再回到原来的位置继续执行而且这个过程是可以嵌套的在优先级1的任务过程中优先级2的任务可以中断优先级1的任务然后优先级3的任务又可以中断优先级2的任务
多个任务可以同一优先级创建的实时任务数量没有软件限制也就是说在理想条件下创建的实时任务可以有无数个
在不断中断的过程中嵌入式系统捕捉外界变化的能力变得十分灵敏实时性有所提高
在delay函数下按照优先级的顺序使用CPU确保CPU能在每个时间段都有事情可做节省资源
3、格式
FreeRtos的配置过程可以直接看正点原子的视频教程这里其实只要懂得基本原理即可直接找一个现成的文件用就可以实在想要自己做就跟着视频教程一步一步来搭建一个Rtos系统 我们这里就不讲怎么配置了文本解释不清还占用篇幅
1定义任务
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务堆栈
StackType_t StartTaskStack[START_STK_SIZE];
//任务控制块
StaticTask_t StartTaskTCB;
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_TASK_PRIO 2
//任务堆栈大小
#define TASK1_STK_SIZE 128
//任务堆栈
StackType_t Task1TaskStack[TASK1_STK_SIZE];
//任务控制块
StaticTask_t Task1TaskTCB;
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);//任务优先级
#define TASK2_TASK_PRIO 3
//任务堆栈大小
#define TASK2_STK_SIZE 128
//任务堆栈
StackType_t Task2TaskStack[TASK2_STK_SIZE];
//任务控制块
StaticTask_t Task2TaskTCB;
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);开始任务start_task是必须要有的然后按照一样的格式将任务1234等创建好确定堆栈以及堆栈大小控制块、句柄以及任务函数的声明
2定义空闲任务
//空闲任务堆栈
static StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
//定时器任务堆栈
static StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];//空闲任务控制块
static StaticTask_t Idle_Task_TCB;
//定时器任务控制块
static StaticTask_t Timer_Task_TCB;//获取空闲任务的任务堆栈和任务控制块内存因为本例程使用的是静态内存
//因此空闲任务的任务堆栈由用户来提供接口函数就是下面这个函数//ppxIdleTaskTCBBuffer:任务控制块内存
//ppxIdleTaskStackBuffer:任务堆栈内存
//pulIdleTaskStackSize:任务堆栈大小
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
{*ppxIdleTaskTCBBufferIdle_Task_TCB;*ppxIdleTaskStackBufferIdle_Task_Stack;*pulIdleTaskStackSizeconfigMINIMAL_STACK_SIZE;
}//获取定时器任务的任务堆栈和任务控制块内存
//ppxTimerTaskTCBBuffer任务控制块内存
//ppxTimerTaskStackBuffer任务堆栈内存
//pulTimerTaskStackSize任务堆栈大小void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t**ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize)
{*ppxTimerTaskTCBBufferTimer_Task_TCB;*ppxTimerTaskStackBufferTimer_Task_Stack;*pulTimerTaskStackSizeconfigTIMER_TASK_STACK_DEPTH;
}3main函数
int main()
{//在前面这里放所使用模块的初始化将所有用到的外设驱动起来//下面就是开始任务函数的定义StartTask_HandlerxTaskCreateStatic((TaskFunction_t )start_task,//任务函数 (const char* )start_task,//任务名称 (uint32_t )START_STK_SIZE, //任务堆栈大小(void* )NULL, //传递给任务函数的参数 (UBaseType_t )START_TASK_PRIO, //任务优先级 (StackType_t* )StartTaskStack, //任务堆栈(StaticTask_t* )StartTaskTCB); //任务控制块vTaskStartScheduler();//开启任务调度
}4开始任务函数
在FreeRtos进入临界段代码的时候需要关闭中断当处理完临界段代码以后再打开中断 一般我们都会使用这个临界区进入和退出是配套使用的我们在使用的时候要尽量保持临时段耗时短
//开始任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL(); //进入临界区//创建task1任务Task1Task_HandlerxTaskCreateStatic((TaskFunction_t )task1_task, (const char* )task1_task, (uint32_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_TASK_PRIO, (StackType_t* )Task1TaskStack, (StaticTask_t* )Task1TaskTCB); //创建task2任务Task2Task_HandlerxTaskCreateStatic((TaskFunction_t )task2_task, (const char* )task2_task, (uint32_t )TASK2_STK_SIZE, (void* )NULL, (UBaseType_t )TASK2_TASK_PRIO, (StackType_t* )Task2TaskStack, (StaticTask_t* )Task2TaskTCB);vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL(); //退出临界区
}这里只是简单地使用FreeRtos掌握Rtos下的多任务多优先级的实现方式掌握FreeRtos的基本用法打造一个实时性系统 今日分享就到这里~