FreeRTOS学习笔记(一):任务的基础知识

FreeRTOS学习笔记(一):任务的基础知识

一、多任务系统

1.1 前后台系统

在学习操作系统之前都是都是裸机开发的,单片机中没有操作系统。裸机开发的特点就是在main函数里进行一个while(1)的大循环,所有的动作都在这个循环里。当有中断来临时,就去执行中断的程序。这种系统称之为前后台系统,中断服务程序为前台,大循环为后台。

在这里插入图片描述

前后台系统缺点:就是实时性差,多个任务之间是轮询的执行的,当一些紧急的任务也必须排队等候。

前后台系统优点:资源消耗小。

1.2 多任务抢占系统

多任务系统是多个任务并发处理的,在很小的时间片段执行每个任务,由于时间片段太小导致人们看起来是同时进行的。在多任务抢占系统中,依靠操作系统的任务调度器来决定在某一时刻到底该哪个任务执行。

在这里插入图片描述

从上图我们可以看出将任务划分优先级,高优先级任务可以抢夺CPU执行权,用这样的工作模式实现了实时性。

1.3任务的特性

● 简单

● 没有使用限制

● 支持抢占

● 支持优先级

● 每个任务都有堆栈导致了RAM使用量增大

二、任务的状态

FreeRTOS总共有4个状态:运行态、就绪态、阻塞态以及挂起态。

运行态:任务正在运行的状态。

就绪态:已经准备运行,但还没有运行,由于同优先级或者更高优先级的任务在运行

阻塞态:任务等待某一事件发生就处于阻塞态。能够阻塞的条件有:vTaskDelay()函数,任务在等待队列、信号量、事件组、通知或者信号量。

挂起:任务进入挂起以后不能被调度器调用进入运行态,只有解挂后才可以被调度。

在这里插入图片描述

三、任务优先级

每个任务都可以被分配一个从0-(configMAX_PRIORITIES-1)的优先级,configMAX_PRIORITIES不能超过32,也就是优先级数不能超过32。

在FreeRTOS系统中,优先级数越小代表优先级越低,configMAX_PRIORITIES-1优先级最高,空闲任务的优先级为0,既是最低。

四、任务控制块

FreeTROS每个任务都有要存储的属性,而FreeTROS用一个结构体来存储这些属性,这个结构体就叫任务控制块:TCB_t,在创建任务时就会分配一个任务控制块。
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack; //任务栈顶

		#if ( portUSING_MPU_WRAPPERS == 1 )
			xMPU_SETTINGS	xMPUSettings;		//MPU相关
		#endif
	
		ListItem_t			xStateListItem;	pended )  	//状态列表项
		ListItem_t			xEventListItem;		     	//事件列表项
		UBaseType_t			uxPriority;					//任务优先级
		StackType_t			*pxStack;					//任务堆栈起始地址
		char				pcTaskName[ configMAX_TASK_NAME_LEN ];  //任务名字
	
		#if ( portSTACK_GROWTH > 0 )
			StackType_t		*pxEndOfStack;		//任务堆栈栈底
		#endif
	
		#if ( portCRITICAL_NESTING_IN_TCB == 1 )
			UBaseType_t		uxCriticalNesting;	//临界区嵌套深度
		#endif
	
		#if ( configUSE_TRACE_FACILITY == 1 )  //trace或debug用到
			UBaseType_t		uxTCBNumber;		
			UBaseType_t		uxTaskNumber;		
		#endif
	
		#if ( configUSE_MUTEXES == 1 )
			UBaseType_t		uxBasePriority;		//基础优先级,优先级反转用到
			UBaseType_t		uxMutexesHeld;      //任务获得互斥量数量
		#endif
	
		#if ( configUSE_APPLICATION_TASK_TAG == 1 )
			TaskHookFunction_t pxTaskTag;
		#endif
	
		#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )  //与本地存储有关
			void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];
		#endif
	
		#if( configGENERATE_RUN_TIME_STATS == 1 )
			uint32_t		ulRunTimeCounter;	//记录运行总时间
		#endif
	
		#if ( configUSE_NEWLIB_REENTRANT == 1 )		
			struct	_reent xNewLib_reent;     //定义一个newlib结构体变量
		#endif
	
		#if( configUSE_TASK_NOTIFICATIONS == 1 )    //任务通知相关变量
			volatile uint32_t ulNotifiedValue;		//任务通知值
			volatile uint8_t ucNotifyState;			//任务通知状态
		#endif
	
		#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
			uint8_t	ucStaticallyAllocated; 		 //任务的动态/静态创建
		#endif
	
		#if( INCLUDE_xTaskAbortDelay == 1 )
			uint8_t ucDelayAborted;
		#endif
	
	} tskTCB;
	
typedef tskTCB TCB_t;

五、任务堆栈

任务堆栈是存放任务资源的,任务调度器在切换任务时将当前任务的现场(CPU寄存器值等)保存在任务堆栈中,等待下次运行时从堆栈中拿出保存的数据,恢复之前的状态继续运行。

创建任务时需要个任务指定堆栈,如果使用动态xTaskCreate创建任务的话,任务堆栈会由xTaskCreate函数自动创建;如果使用静态创建xTaskCreateStatic任务的话,需要程序员自己定义任务堆栈,然后堆栈首地址作为函数的参数puxStackBuffer传递给函数,如下:

TaskHandle_t xTaskCreateStatic(	TaskFunction_t pxTaskCode,
								const char * const pcName,
								const uint32_t ulStackDepth,
								void * const pvParameters,
								UBaseType_t uxPriority,
								StackType_t * const puxStackBuffer,  //任务堆栈需要用户自己定义
								StaticTask_t * const pxTaskBuffer )

堆栈大小
不管用什么方式创建任务,任务堆栈大小都是StackType_t,实际上是uint32_t。变量类型位4字节,那么任务实际的堆栈大小就应该是我们所定义的4倍。

参考文献:
FreeRTOS开发手册.左忠凯

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中文的参考手册 内容 Contents5..................................................................................................................................................... 列表 Figures8............................................................................................................................................... 代码清单 Listings9....................................................................................................................................... Tables15 名单.............................................................................................................................................. 列表 Notation15........................................................................................................................................... 章节 1 关于这............................................................................................................................. Manual16 1.1Scope17............................................................................................................................................. 章节 2Task 和调度........................................................................................................................... API20 2.1 portSWITCH_TO_USER_MODE() 21.................................................................................. 2.2 vTaskAllocateMPURegions() 22........................................................................................... 2.3 xTaskAbortDelay() 25............................................................................................................. 2.4 xTaskCallApplicationTaskHook() 27.................................................................................... 2.5 xTaskCheckForTimeOut() 30................................................................................................ 2.6 xTaskCreate() 32..................................................................................................................... 2.7 xTaskCreateStatic() 37........................................................................................................... 2.8 xTaskCreateRestricted() 41................................................................................................... 2.9 vTaskDelay() 46....................................................................................................................... 2.10 vTaskDelayUntil() 48............................................................................................................... 2.11 vTaskDelete() 51..................................................................................................................... 2.12 taskDISABLE_INTERRUPTS() 53........................................................................................ 2.13 taskENABLE_INTERRUPTS() 55......................................................................................... 2.14 taskENTER_CRITICAL() 56.................................................................................................. 2.15 taskENTER_CRITICAL_FROM_ISR() 59........................................................................... 2.16 taskEXIT_CRITICAL() 61....................................................................................................... 2.1 taskEXIT_CRITICAL_FROM_ISR() 63................................................................................ 2.2 xTaskGetApplicationTaskTag() 65....................................................................................... 2.3 xTaskGetCurrentTaskHandle() 67........................................................................................ 2.4 xTaskGetIdleTaskHandle() 68............................................................................................... 2.1 xTaskGetHandle() 69.............................................................................................................. 2.2 uxTaskGetNumberOfTasks() 71........................................................................................... 2.3 vTaskGetRunTimeStats() 72................................................................................................. 2.4 xTaskGetSchedulerState() 76...............................................................................................六 2.5 uxTaskGetStackHighWaterMark() 77.................................................................................. 2.6 eTaskGetState() 79................................................................................................................. 2.7 uxTaskGetSystemState() 81.................................................................................................. 2.8 vTaskGetTaskInfo() 85........................................................................................................... 2.9 pvTaskGetThreadLocalStoragePointer() 87.......................................................................7 2.10 pcTaskGetName() 89.............................................................................................................. 2.11 xTaskGetTickCount() 90........................................................................................................ 2.12 xTaskGetTickCountFromISR() 92........................................................................................ 2.13 vTaskList() 94........................................................................................................................... 2.14 xTaskNotify() 97....................................................................................................................... 2.15 xTaskNotifyAndQuery() 100.................................................................................................. 2.16 xTaskNotifyAndQueryFromISR() 104.................................................................................. 2.17 xTaskNotifyFromISR() 108.................................................................................................... 2.18 xTaskNotifyGive() 113............................................................................................................ 2.19 vTaskNotifyGiveFromISR() 116............................................................................................ 2.20 xTaskNotifyStateClear() 119.................................................................................................. 2.21 ulTask​ ​ NotifyTake() 121.................................................................................................. 2.22 xTaskNotifyWait() 124............................................................................................................ 2.23 uxTaskPriorityGet() 127.......................................................................................................... 2.24 vTaskPrioritySet() 129............................................................................................................ 2.25 vTaskResume() 131................................................................................................................ 2.26 xTaskResumeAll() 133........................................................................................................... 2.27 xTaskResumeFromISR() 136................................................................................................ 2.28 vTaskSetApplicationTaskTag() 139...................................................................................... 2.29 vTaskSetThreadLocalStoragePointer() 141........................................................................ 2.30 vTaskSetTimeOutState() 143................................................................................................ 2.31 vTaskStartScheduler() 145.................................................................................................... 2.32 vTaskStepTick() 147............................................................................................................... 2.33 vTaskSuspend() 149............................................................................................................... 2.34 vTaskSuspendAll() 151.......................................................................................................... 2.35 taskYIELD() 153...................................................................................................................... 章节 3Queue.................................................................................................................................. API155 3.1 vQueueAddToRegistry() 156................................................................................................. 3.2 xQueueAddToSet() 158.......................................................................................................... 3.3 xQueueCreate() 160............................................................................................................... 3.4 xQueueCreateSet() 162......................................................................................................... 3.5 xQueueCreateStatic() 166..................................................................................................... 3.6 vQueueDelete() 168................................................................................................................ 3.7 pcQueueGetName() 170........................................................................................................ 3.8 xQueueIsQueueEmptyFromISR() 171................................................................................. 3.9 xQueueIsQueueFullFromISR() 172...................................................................................... 3.10 uxQueueMessagesWaiting() 173.......................................................................................... 3.11 uxQueueMessagesWaitingFromISR() 174..........................................................................六 3.12 xQueueOverwrite() 176.......................................................................................................... 3.13 xQueueOverwriteFromISR() 178.......................................................................................... 3.14 xQueuePeek() 180.................................................................................................................. 3.15 xQueuePeekFromISR() 183.................................................................................................. 3.16 xQueueReceive() 184............................................................................................................. 3.17 xQueueReceiveFromISR() 187............................................................................................. 3.18 xQueueRemoveFromSet() 190............................................................................................. 3.19 xQueueReset() 192................................................................................................................. 3.20 xQueueSelectFromSet() 193................................................................................................. 3.21 xQueueSelectFromSetFromISR() 195................................................................................. 3.22 xQueueSend() , xQueueSendToFront() , xQueueSendToBack() 197............... 3.23 xQueueSendFromISR() , xQueueSendToBackFromISR() , xQueueSendToFrontFromISR() ............................................................200 3.24 uxQueueSpacesAvailable() 204............................................................................................ 章节 4Semaphore......................................................................................................................... API206 4.1 vSemaphoreCreateBinary() 207........................................................................................... 4.2 xSemaphoreCreateBinary() 210........................................................................................... 4.3 xSemaphoreCreateBinaryStatic() 213................................................................................. 4.4 xSemaphoreCreateCounting() 216....................................................................................... 4.5 xSemaphoreCreateCountingStatic() 219............................................................................. 4.6 xSemaphoreCreateMutex() 222............................................................................................ 4.7 xSemaphoreCreateMutexStatic() 224.................................................................................. 4.8 xSemaphoreCreateRecursiveMutex() 226.......................................................................... 4.9 xSemaphoreCreateRecursiveMutexStatic() 229................................................................ 4.10 vSemaphoreDelete() 231....................................................................................................... 4.11 uxSemaphoreGetCount() 232............................................................................................... 4.12 xSemaphoreGetMutexHolder() 233...................................................................................... 4.13 xSemaphoreGive() 234.......................................................................................................... 4.14 xSemaphoreGiveFromISR() 236.......................................................................................... 4.15 xSemaphoreGiveRecursive() 239......................................................................................... 4.16 xSemaphoreTake() 242.......................................................................................................... 4.17 xSemaphoreTakeFromISR() 245.......................................................................................... 4.18 xSemaphoreTakeRecursive() 247........................................................................................ 章节 5Software 定时器................................................................................................................. API251 5.1 xTimerChangePeriod() 252.................................................................................................... 5.2 xTimerChangePeriodFromISR() 255.................................................................................... 5.3 xTimerCreate() 257................................................................................................................. 5.4 xTimerCreateStatic() 261.......................................................................................................9 5.5 xTimerDelete() 265.................................................................................................................. 5.1 xTimerGetExpiryTime() ....................................................................................................267 5.1 pcTimerGetName() 269.......................................................................................................... 5.2 xTimerGetPeriod() 270........................................................................................................... 5.3 xTimerGetTimerDaemonTaskHandle() 271........................................................................ 5.4 pvTimerGetTimerID() 272...................................................................................................... 5.5 xTimerIsTimerActive() 274..................................................................................................... 5.6 xTimerPendFunctionCall() 276.............................................................................................. 5.7 xTimerPendFunctionCallFromISR() 278..............................................................................8 5.8 xTimerReset() 281................................................................................................................... 5.9 xTimerResetFromISR() 284................................................................................................... 5.10 vTimerSetTimerID() 286......................................................................................................... 5.11 xTimerStart() 288..................................................................................................................... 5.12 xTimerStartFromISR() 290..................................................................................................... 5.13 xTimerStop() 292..................................................................................................................... 5.14 xTimerStopFromISR() 294..................................................................................................... 章节 6Event 组............................................................................................................................... API296 6.1 xEventGroupClearBits() 297.................................................................................................. 6.2 xEventGroupClearBitsFromISR() 299.................................................................................. 6.3 xEventGroupCreate() 302...................................................................................................... 6.4 xEventGroupCreateStatic() 304............................................................................................ 6.1 vEventGroupDelete() 306...................................................................................................... 6.2 xEventGroupGetBits() 307..................................................................................................... 6.1 xEventGroupGetBitsFromISR() 308..................................................................................... 6.2 xEventGroupSetBits() 309..................................................................................................... 6.3 xEventGroupSetBitsFromISR() 311..................................................................................... 6.1 xEventGroupSync() 314......................................................................................................... 6.2 xEventGroupWaitBits() 318................................................................................................... 章节 7Kernel................................................................................................................. Configuration321 7.1 FreeRTOSConfig.h322............................................................................................................... 7.2 常量开始“INCLUDE_”...........................................................................................................323 7.3 常量开始“配置”.......................................................................................................................327 附录 1: 数据类型和编码样式.................................................................................................. Guide347

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值