(第1-8讲)STM32F4单片机,FreeRTOS基础知识总结【视频笔记、代码讲解】【正点原子】【原创】


🔴🟡🟢其他文章链接,独家吐血整理

【吐血总结】FreeRTOS难点、Systick中断-滴答定时器、PendSV中断-任务切换、SVC中断-系统底层、时间片调度-时钟节拍【已完结】
(第1-8讲)STM32F4单片机,FreeRTOS基础知识总结【视频笔记、代码讲解】【正点原子】【原创】
(第9-10讲)STM32F4单片机,FreeRTOS任务创建和删除(动态方法)【视频笔记、代码讲解】【正点原子】【原创】
(第12讲)STM32F4单片机,FreeRTOS任务创建和删除(静态方法)【视频笔记、代码讲解】【正点原子】【原创】
(第13-14讲)STM32F4单片机,FreeRTOS任务挂起和恢复【视频笔记、代码讲解】【正点原子】【原创】
(第16-17讲)STM32F4单片机,FreeRTOS中断管理简介【视频笔记、代码讲解】【正点原子】【原创】
(第18-19讲)32单片机,FreeRTOS临界段代码保护、任务调度器的挂起和恢复【视频笔记、代码讲解】【原创】
(第20-22讲)STM32F4单片机,FreeRTOS列表和列表项API函数讲解【视频笔记、代码讲解、正点原子】【原创】
(第34-36讲)FreeRTOS消息队列知识汇总【B站UP、硬件家园、普中科技、正点原子】【视频笔记】【原创】
(第40-44讲)STM32F4单片机,FreeRTOS信号量【二值、计数、翻转、互斥】【代码讲解】【正点原子】【原创】
(第48-59讲)STM32F4单片机,FreeRTOS【事件标志、任务通知、软件定时器、Tickless低功耗】【纯文字讲解】【原创】

1、实验现象

实验现象: 本实验在STM32F407开发板上移植了FreeRTOS,版本为V9.0.0。例程中创建了四个任务来测试移植是否成功。start_task任务创建其他3个测试任务,led0_task任务中LED0闪烁,led1_task任务中LED1闪烁, float_task测试浮点运算。

2、代码讲解(个人注释)

TaskHandle_t StartTask_Handler;

//typedef void * TaskHandle_t;
//TaskHandle_t=void *
//上行相当于 void *p;
//类似于C语言中的指针
//int i=0,int *p,p=&i;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

//设置系统中断优先级分组4
//第4组,所有4位指定抢占式优先级,16个抢占优先级数
//详情可看下文链接

32单片机与计算机网络,细碎知识【5000字】【来源实习日记】【原创】

    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄
	//创建开始任务
    //xTaskCreate只是一个普通函数,这里面都是实参而已
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
    //typedef void (*TaskFunction_t)( void * );
    //定义了一个指向void型的函数(一个void型的指针形参入口的函数)的指针TaskFunction_t
    //start_task是函数名=函数的起始地址=函数的入口地址
    //将start_task指针,强制为TaskFunction_t函数指针的类型void* 型
                (const char*    )"start_task",          //任务名称
                //又强制转化为char* 型
                //这是字符串的首地址指针
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄
                //StartTask_Handler是void *类型的指针
                //指针的指针=void **;
                //TaskHandle_t=void *

3、demo函数(正点原子)

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
/************************************************
 ALIENTEK 探索者STM32F407开发板 FreeRTOS实验2-1
 FreeRTOS移植实验-库函数版本
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;//typedef void * TaskHandle_t;//TaskHandle_t=void *
//上行相当于 void *p;
//类似于C语言中的指针//int i=0,int *p,p=&i;

//任务函数
void start_task(void *pvParameters);

//任务优先级
#define LED0_TASK_PRIO		2
//任务堆栈大小	
#define LED0_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);

//任务优先级
#define LED1_TASK_PRIO		3
//任务堆栈大小	
#define LED1_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);

//任务优先级
#define FLOAT_TASK_PRIO		4
//任务堆栈大小	
#define FLOAT_STK_SIZE 		128
//任务句柄
TaskHandle_t FLOATTask_Handler;
//任务函数
void float_task(void *pvParameters);

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	//第4组,所有4位指定抢占式优先级,16个抢占优先级数
	delay_init(168);		//初始化延时函数
	uart_init(115200);     	//初始化串口
	LED_Init();		        //初始化LED端口
	
	//创建开始任务
    //xTaskCreate只是一个普通函数,这里面都是实参而已
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
    //typedef void (*TaskFunction_t)( void * );
    //定义了一个指向void型的函数(一个void型的指针形参入口的函数)的指针TaskFunction_t
    //start_task是函数名=函数的起始地址=函数的入口地址
    //将start_task指针,强制为TaskFunction_t函数指针的类型void* 型
                (const char*    )"start_task",          //任务名称
                //又强制转化为char* 型
                //这是字符串的首地址指针
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄
                //StartTask_Handler是void *类型的指针
                //指针的指针=void **;
                //TaskHandle_t=void *
    vTaskStartScheduler();          //开启任务调度
}
 
//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建LED0任务
    xTaskCreate((TaskFunction_t )led0_task,     	
                (const char*    )"led0_task",   	
                (uint16_t       )LED0_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )LED0_TASK_PRIO,	
                (TaskHandle_t*  )&LED0Task_Handler);   
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);        
    //浮点测试任务
    xTaskCreate((TaskFunction_t )float_task,     
                (const char*    )"float_task",   
                (uint16_t       )FLOAT_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )FLOAT_TASK_PRIO,
                (TaskHandle_t*  )&FLOATTask_Handler);  
    vTaskDelete(StartTask_Handler); //删除开始任务
    //StartTask_Handler=void *
    taskEXIT_CRITICAL();            //退出临界区
}

//LED0任务函数 
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0=~LED0;
        vTaskDelay(500);
    }
}   

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);
    }
}

//浮点测试任务
void float_task(void *pvParameters)
{
	static float float_num=0.00;
	while(1)
	{
		float_num+=0.01f;
		printf("float_num的值为: %.4f\r\n",float_num);
        vTaskDelay(1000);
	}
}

4、视频讲解笔记

1、2024温故知新(纯文字)

freertos支持三种调度算法
抢占式调度-针对优先级不同任务
任务数值越大,优先级越高
运行态,就绪态,就绪态->运行态
1、高优先级抢占低优先级,低优先级进入就绪态,高优先级进入运行态(进入运行态的前提必须是就绪态)

时间片调度-针对优先级相同任务
一个时间片用不完的部分不会给其它的任务使用,即丢失
同等优先级任务根据时间片轮询-即时间片轮询

协程式调度-已淘汰-官方不维护

运行态
rtos同一时间只允许一个任务处于运行态
就绪->运行

就绪态
我准备好了,准备进入运行态
阻塞/挂起/运行->就绪->运行

阻塞态
延时造成的
运行->阻塞->就绪->运行

挂起态
运行->挂起->就绪->运行

除了运行态,其余三个都有列表,即用链表方式来查询任务并运行任务,32个列表,0-31是列表的任务优先级数值(数值越大越高),查询某个列表里面是否有任务执行
就绪列表
阻塞列表
挂起列表
一个任务一次性只存在于一种列表中(如果任务是非运行态,因为没有运行列表),一个列表代表一种优先级,一个列表可以放0个或1个或者多个任务(多个任务都是相同的优先级),这个任务数量rtos好像没有限制ucos好像最多是64

rtos移植代码步骤一共是9个.c文件
跟调度有关的是7个.c文件
软件硬件之间的桥梁是2个.c文件
1个FreeRTOSConfig.h配置文件,用来裁剪系统,里面都是些宏

tasks.c 必需,任务操作
list.c 必须,列表
queue.c 基本必需,提供队列操作、信号量(semaphore)操作
timer.c 可选,software timer
event_groups.c 可选,提供event group功能
croutine.c 可选,过时
stream_buffer.c 可选,通信数据传输启用流缓冲区功能
RVDS文件夹中的port.c 适配CortexM3内核
MemMang文件夹下的heap_4.c 内存管理

FreeRTOSConfig.h FreeRTOS的配置文件,比如选择调度算法:configUSE_PREEMPTION 每个demo都必定含有FreeRTOSConfig.h 建议去修改demo中的FreeRTOSConfig.h,而不是从头写一个
FreeRTOS.h 使用FreeRTOS API函数时,必须包含此文件。 在FreeRTOS.h之后,再去包含其他头文件,比如: task.h、queue.h、semphr.h、event_group.h
————————————————
版权声明:本文为CSDN博主「嵌入式小白—小黑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Goforyouqp/article/details/131682986

freertos支持三种调度算法
抢占式调度-针对优先级不同任务
任务数值越大,优先级越高
运行态,就绪态,就绪态->运行态
1、高优先级抢占低优先级,低优先级进入就绪态,高优先级进入运行态(进入运行态的前提必须是就绪态)

时间片调度-针对优先级相同任务
一个时间片用不完的部分不会给其它的任务使用,即丢失
同等优先级任务根据时间片轮询-即时间片轮询

协程式调度-已淘汰-官方不维护

运行态
rtos同一时间只允许一个任务处于运行态
就绪->运行

就绪态
我准备好了,准备进入运行态
阻塞/挂起/运行->就绪->运行

阻塞态
延时造成的
运行->阻塞->就绪->运行

挂起态
运行->挂起->就绪->运行

除了运行态,其余三个都有列表,即用链表方式来查询任务并运行任务,32个列表,0-31是列表的任务优先级数值(数值越大越高),查询某个列表里面是否有任务执行
就绪列表
阻塞列表
挂起列表
一个任务一次性只存在于一种列表中(如果任务是非运行态,因为没有运行列表),一个列表代表一种优先级,一个列表可以放0个或1个或者多个任务(多个任务都是相同的优先级),这个任务数量rtos好像没有限制ucos好像最多是64

rtos移植代码步骤一共是9.c文件
跟调度有关的是7.c文件
软件硬件之间的桥梁是2.c文件
1个FreeRTOSConfig.h配置文件,用来裁剪系统,里面都是些宏

tasks.c	必需,任务操作
list.c	必须,列表
queue.c	基本必需,提供队列操作、信号量(semaphore)操作
timer.c	可选,software timer
event_groups.c	可选,提供event group功能
croutine.c	                可选,过时
stream_buffer.c        可选,通信数据传输启用流缓冲区功能
RVDS文件夹中的port.c  适配CortexM3内核
MemMang文件夹下的heap_4.c  内存管理

FreeRTOSConfig.h	FreeRTOS的配置文件,比如选择调度算法:configUSE_PREEMPTION 每个demo都必定含有FreeRTOSConfig.h 建议去修改demo中的FreeRTOSConfig.h,而不是从头写一个
FreeRTOS.h	使用FreeRTOS API函数时,必须包含此文件。 在FreeRTOS.h之后,再去包含其他头文件,比如: task.h、queue.h、semphr.h、event_group.h
————————————————
版权声明:本文为CSDN博主「嵌入式小白—小黑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Goforyouqp/article/details/131682986
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/* 头文件 */
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include <stdint.h>

extern uint32_t SystemCoreClock;

/* 基础配置项 */
#define configUSE_PREEMPTION                            1                       /* 1: 抢占式调度器, 0: 协程式调度器, 无默认需定义 */
协程式调度器官方已放弃
#define configUSE_PORT_OPTIMISED_TASK_SELECTION         1                       /* 1: 使用硬件计算下一个要运行的任务, 0: 使用软件算法计算下一个要运行的任务, 默认: 0 */
软件方式效率低点,不限制任务优先级的最大值;硬件方式任务优先级为0-31
#define configUSE_TICKLESS_IDLE                         0                       /* 1: 使能tickless低功耗模式, 默认: 0 */
#define configCPU_CLOCK_HZ                              SystemCoreClock         /* 定义CPU主频, 单位: Hz, 无默认需定义 */
SystemCoreClock这个数值并不是真正的频率,将其计算之后的数值才是
//#define configSYSTICK_CLOCK_HZ                          (configCPU_CLOCK_HZ / 8)/* 定义SysTick时钟频率,当SysTick时钟频率与内核时钟频率不同时才可以定义, 单位: Hz, 默认: 不定义 */
只有F1才用上面这行语句,其余不需要用
#define configTICK_RATE_HZ                              1000                    /* 定义系统时钟节拍频率, 单位: Hz, 无默认需定义 */
滴答定时器的频率,代表1000hz,1s记1000个数,即1ms中断
#define configMAX_PRIORITIES                            32                      /* 定义最大优先级数, 最大优先级=configMAX_PRIORITIES-1, 无默认需定义 */
#define configMINIMAL_STACK_SIZE                        128                     /* 定义空闲任务的栈空间大小, 单位: Word, 无默认需定义 */
128*4个字节
#define configMAX_TASK_NAME_LEN                         16                      /* 定义任务名最大字符数, 默认: 16 */
#define configUSE_16_BIT_TICKS                          0                       /* 1: 定义系统时钟节拍计数器的数据类型为16位无符号数, 无默认需定义 */
0代表是32位无符号整型
#define configIDLE_SHOULD_YIELD                         1                       /* 1: 使能在抢占式调度下,同优先级的任务能抢占空闲任务, 默认: 1 */
空闲任务优先级固定为0,则优先级为0的任务也能抢占空闲
#define configUSE_TASK_NOTIFICATIONS                    1                       /* 1: 使能任务间直接的消息传递,包括信号量、事件标志组和消息邮箱, 默认: 1 */
#define configTASK_NOTIFICATION_ARRAY_ENTRIES           1                       /* 定义任务通知数组的大小, 默认: 1 */
#define configUSE_MUTEXES                               1                       /* 1: 使能互斥信号量, 默认: 0 */
#define configUSE_RECURSIVE_MUTEXES                     1                       /* 1: 使能递归互斥信号量, 默认: 0 */
#define configUSE_COUNTING_SEMAPHORES                   1                       /* 1: 使能计数信号量, 默认: 0 */
#define configUSE_ALTERNATIVE_API                       0                       /* 已弃用!!! */
#define configQUEUE_REGISTRY_SIZE                       8                       /* 定义可以注册的信号量和消息队列的个数, 默认: 0 */
#define configUSE_QUEUE_SETS                            1                       /* 1: 使能队列集, 默认: 0 */
#define configUSE_TIME_SLICING                          1                       /* 1: 使能时间片调度, 默认: 1 */
#define configUSE_NEWLIB_REENTRANT                      0                       /* 1: 任务创建时分配Newlib的重入结构体, 默认: 0 */
#define configENABLE_BACKWARD_COMPATIBILITY             0                       /* 1: 使能兼容老版本, 默认: 1 */
0代表不兼容老版本
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS         0                       /* 定义线程本地存储指针的个数, 默认: 0 */
#define configSTACK_DEPTH_TYPE                          uint16_t                /* 定义任务堆栈深度的数据类型, 默认: uint16_t */
#define configMESSAGE_BUFFER_LENGTH_TYPE                size_t                  /* 定义消息缓冲区中消息长度的数据类型, 默认: size_t */

/* 内存分配相关定义 */
#define configSUPPORT_STATIC_ALLOCATION                 0                       /* 1: 支持静态申请内存, 默认: 0 */
0代表不支持静态
#define configSUPPORT_DYNAMIC_ALLOCATION                1                       /* 1: 支持动态申请内存, 默认: 1 */
#define configTOTAL_HEAP_SIZE                           ((size_t)(10 * 1024))   /* FreeRTOS堆中可用的RAM总量, 单位: Byte, 无默认需定义 */
动态分配这个堆栈空间,1024B=1024Byte=1KB=1K字节=10K字节=1024*8bit
#define configAPPLICATION_ALLOCATED_HEAP                0                       /* 1: 用户手动分配FreeRTOS内存堆(ucHeap), 默认: 0 */
0是自动分配
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP       0                       /* 1: 用户自行实现任务创建时使用的内存申请与释放函数, 默认: 0 */
0是自动分配

/* 钩子函数相关定义 */
#define configUSE_IDLE_HOOK                             0                       /* 1: 使能空闲任务钩子函数, 无默认需定义  */
钩子函数是回调函数,0是不使用
#define configUSE_TICK_HOOK                             0                       /* 1: 使能系统时钟节拍中断钩子函数, 无默认需定义 */
#define configCHECK_FOR_STACK_OVERFLOW                  0                       /* 1: 使能栈溢出检测方法1, 2: 使能栈溢出检测方法2, 默认: 0 */
#define configUSE_MALLOC_FAILED_HOOK                    0                       /* 1: 使能动态内存申请失败钩子函数, 默认: 0 */
#define configUSE_DAEMON_TASK_STARTUP_HOOK              0                       /* 1: 使能定时器服务任务首次执行前的钩子函数, 默认: 0 */

/* 运行时间和任务状态统计相关定义 */
#define configGENERATE_RUN_TIME_STATS                   0                       /* 1: 使能任务运行时间统计功能, 默认: 0 */
#if configGENERATE_RUN_TIME_STATS
#include "./BSP/TIMER/btim.h"
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()        ConfigureTimeForRunTimeStats()
extern uint32_t FreeRTOSRunTimeTicks;
#define portGET_RUN_TIME_COUNTER_VALUE()                FreeRTOSRunTimeTicks
#endif
#define configUSE_TRACE_FACILITY                        1                       /* 1: 使能可视化跟踪调试, 默认: 0 */
#define configUSE_STATS_FORMATTING_FUNCTIONS            1                       /* 1: configUSE_TRACE_FACILITY为1时,会编译vTaskList()和vTaskGetRunTimeStats()函数, 默认: 0 */
这两个函数是用来获取任务的一些内部信息

/* 协程相关定义 */
#define configUSE_CO_ROUTINES                           0                       /* 1: 启用协程, 默认: 0 */
#define configMAX_CO_ROUTINE_PRIORITIES                 2                       /* 定义协程的最大优先级, 最大优先级=configMAX_CO_ROUTINE_PRIORITIES-1, 无默认configUSE_CO_ROUTINES为1时需定义 */

/* 软件定时器相关定义 */
#define configUSE_TIMERS                                1                               /* 1: 使能软件定时器, 默认: 0 */
#define configTIMER_TASK_PRIORITY                       ( configMAX_PRIORITIES - 1 )    /* 定义软件定时器任务的优先级, 无默认configUSE_TIMERS为1时需定义 */
configMAX_PRIORITIES是32
#define configTIMER_QUEUE_LENGTH                        5                               /* 定义软件定时器命令队列的长度, 无默认configUSE_TIMERS为1时需定义 */
#define configTIMER_TASK_STACK_DEPTH                    ( configMINIMAL_STACK_SIZE * 2) /* 定义软件定时器任务的栈空间大小, 无默认configUSE_TIMERS为1时需定义 */
是空闲任务的栈空间大小的2/* 可选函数, 1: 使能 */
#define INCLUDE_vTaskPrioritySet                        1                       /* 设置任务优先级 */
#define INCLUDE_uxTaskPriorityGet                       1                       /* 获取任务优先级 */
#define INCLUDE_vTaskDelete                             1                       /* 删除任务 */
#define INCLUDE_vTaskSuspend                            1                       /* 挂起任务 */
#define INCLUDE_xResumeFromISR                          1                       /* 恢复在中断中挂起的任务 */
#define INCLUDE_vTaskDelayUntil                         1                       /* 任务绝对延时 */
#define INCLUDE_vTaskDelay                              1                       /* 任务延时 */
#define INCLUDE_xTaskGetSchedulerState                  1                       /* 获取任务调度器状态 */
#define INCLUDE_xTaskGetCurrentTaskHandle               1                       /* 获取当前任务的任务句柄 */
#define INCLUDE_uxTaskGetStackHighWaterMark             1                       /* 获取任务堆栈历史剩余最小值 */
#define INCLUDE_xTaskGetIdleTaskHandle                  1                       /* 获取空闲任务的任务句柄 */
#define INCLUDE_eTaskGetState                           1                       /* 获取任务状态 */
#define INCLUDE_xEventGroupSetBitFromISR                1                       /* 在中断中设置事件标志位 */
#define INCLUDE_xTimerPendFunctionCall                  1                       /* 将函数的执行挂到定时器服务任务 */
#define INCLUDE_xTaskAbortDelay                         1                       /* 中断任务延时 */
#define INCLUDE_xTaskGetHandle                          1                       /* 通过任务名获取任务句柄 */
#define INCLUDE_xTaskResumeFromISR                      1                       /* 恢复在中断中挂起的任务 */

/* 中断嵌套行为配置 */
#ifdef __NVIC_PRIO_BITS
    #define configPRIO_BITS __NVIC_PRIO_BITS
#else
    #define configPRIO_BITS 4
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15                  /* 中断最低优先级 */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5                   /* FreeRTOS可管理的最高中断优先级 */
#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_API_CALL_INTERRUPT_PRIORITY           configMAX_SYSCALL_INTERRUPT_PRIORITY

/* FreeRTOS中断服务函数相关定义 */
#define xPortPendSVHandler                              PendSV_Handler
#define vPortSVCHandler                                 SVC_Handler

/* 断言 */
#define vAssertCalled(char, int) printf("Error: %s, %d\r\n", char, int)
#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ )
打印错误在哪个文件哪一行

/* FreeRTOS MPU 特殊定义 */
//#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0
//#define configTOTAL_MPU_REGIONS                                8
//#define configTEX_S_C_B_FLASH                                  0x07UL
//#define configTEX_S_C_B_SRAM                                   0x07UL
//#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY            1
//#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS             1

/* ARMv8-M 安全侧端口相关定义。 */
//#define secureconfigMAX_SECURE_CONTEXTS         5

#endif /* FREERTOS_CONFIG_H */

在这里插入图片描述
在这里插入图片描述
中断可以打断任意任务==(虽然是OS系统,但是库函数编程时的中断还是存在滴,即中断还是优先级最高滴)==
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第三种已经被淘汰了

在这里插入图片描述
抢占、就绪、阻塞
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:时间片=1ms一次=任务之间以1ms周期进行流转
一个就绪列表0-31共32个成员(即32个优先级,31代表最高,调度器也是首先在就序列表中自上而下寻找可以进入运行态的任务)(只有先进入就绪,才可以进入运行),一个列表中可以有多个任务(即这些任务有相同的优先级,即顺序执行)
运行进入阻塞之后,则等待抢占它的之后执行完之后,自动进入就绪
运行进入挂起之后,不自动了,需要手动开启调用,才会进入就绪
在这里插入图片描述
在这里插入图片描述

5、视频补充知识(来自正点原子全新HAL库视频)

1、ZI-Data、SARM、FLASH(补充)

在这里插入图片描述
白话:cpu从flash里面读取代码,如果代码中定义了某个变量 i 的数值为1,那么cpu会将数据1存在ROM(SARM)里面,下次再使用 i 的数据1时就是从ROM里面某个地址里面读取这个数据1
专业术语:cpu读取flash里面的指令–>执行指令–>得到变量 i 的地址–>得到变量 i 的数据–>找到ROM里面这个地址位置–>存进去数据1–>下次再使用时,在找到这个地址位置,再读出来这个数据
那么,假如ZI-Data里面的数据,我们都事先知道了它是0,无需先从flash里面读这个指令(读不读这个指令,我都知道这个指令中的这个数据初值就是0),那么我们就直接存在SARM里面就好了,省略了中间的flash这一步。。。

2、基于单片机的C语言复习(补充)

在这里插入图片描述在这里插入图片描述
显然,方法二优于方法一(因为方法一要算,如果多位幅值很麻烦)
在这里插入图片描述
在这里插入图片描述

3、基于#define宏定义中do while(0)使用(补充)

在这里插入图片描述
至于为什么这样?见下文链接!(点击可查看

宏定义中do while(0)使用

4、指针使用的2大最常见问题(补充)

在这里插入图片描述
在这里插入图片描述

5、绝对路径(旧版本)与相对路径(新版本)(补充)

在这里插入图片描述
旧版本中,HARDWARE文件夹中每添加一个外设驱动(比如SPI与SARM),都要在魔术棒中手动添加这个文件夹
在这里插入图片描述
新版本中,BSP中是外设驱动,添加就无需动魔术棒了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
默认路径就是工程的绝对路径位置
在这里插入图片描述
因此,这里面都是从默认路径的上上层开始往下找,即…\开始

在这里插入图片描述
当然,头文件还是要自己添加

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值