FreeRTOS学习摘要

本文档记录了FreeRTOS的学习,包括初识FreeRTOS、链表的结构与使用,以及任务的创建和管理。详细介绍了链表的完整性检查、列表项的初始化,以及任务创建函数xTaskCreate和xTaskCreateStatic的参数与功能。此外,还提到了任务挂起、恢复的相关函数以及中断级任务切换的过程。
摘要由CSDN通过智能技术生成

FreeRTOS学习记录

教材教参:野火教程《FreeRTOS内核实现与应用开发实战指南:基于STM32》刘火良,杨森
正点原子教程《STM32F1 FreeRTOS开发手册 V1.1》左忠凯

1.初识FreeRTOS

	Jan.22th,2020,Wed
	移植FreeRTOS内核文件
	TCB:Task Control Block(任务控制块)
	ISR:Interrut Server Request(中断服务请求)
	
	
	
	Jan.23th,2020,Thu
		获取一个调度器的状态
	Jan.24th,2020,Fri 		 New Year's Eve

2.链表

	Jan.25th,2020,Sat		New Year
		链表


	Jan.26th,2020,Sun
		链表
		
	Feb.6th,2020,Thu	
		列表
		列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。与列表相关的全部东西
	都在文件list.c和list.h中。在list.h中定义了一个叫List_t的结构体,如下:
typedef struct xLIST
		{
   
			listFIRST_LIST_INCLUDE_CHECK_VALUE							(1)
			configLIST_VOLATILE UBaseType			uxNumberOfItems;	(2)
			ListItem_t *configLIST_VOLATILE			pxIndex;			(3)
			MiniListItem_t							xLISTEnd;			(4)
			listSECOND_LIST_INTEGRITY_CHECK_VALUE						(5)
		}List_t;

(1)和(5),这两个都是用来检测列表完整性的,需要将宏configUSE_LIST_DATA_CHECK_BYTES设置为1,开启以后会向这两个
地方分别添加一个变量xListIntergrityValue1和xListIntegrityValue2,在初始化列表的时候对这两个变量中写入一个特殊的值,
默认不开启这个功能。
(2)uxNumberOfItems用来记录当前列表项的数量
(3)pxIndex用来记录当前列表项索引号,用于遍历列表
(4)列表中最后一个列表项,用来表示列表结束,此变量类型为MiniListItem_t 这是一个迷你列表项
列表
________________
|uxNumberOfItems |
________________
|pxIndex |
_________________
|xListEnd |
_________________

					列表示意图
		图中并未列出用于列表完整性检查的成员变量
		
		
		
		列表项就是放在列表中的项目,FreeRTOS提供了两种类表项:列表项和迷你列表项。这两个都在list.h中
	有定义,列表项定义如下:			
struct xLIST_ITEM
			{
   
				listFIRST_LIST_INCLUDE_CHECK_VALUE					(1)
				configLIST_VOLATILE TickType_t			xItemValue;	(2)
				struct xLIST_ITEM *configLIST_VOLATILE	pxNext;		(3)
				struct xLIST_ITEM *configLIST_VOLATILE	pxPrevious;	(4)
				void *									pvOwner;	(5)
				void *configLIST_VOLATILE				pvContainer;(6)
				listSECOND_LIST_INTEGRITY_CHECK_VALUE				(7)
							
			};
			typedef struct xLIST_ITEM ListItem_t;	

typedef struct xLIST_ITEM ListItem_t;
(1)和(7)用法和列表一样,用来检查列表项完整性
(2)xItemvalue为列表项值
(3)pxNext指向下一个列表项
(4)pxPrevious指向前一个列表项,和pxNext配合起来实现类似双向链表的功能。
(5)pxOwner记录此链表项归谁拥有,通常是任务控制块
(6)pvContainer用来记录此列表项归哪个列表。注意和pvOwner的区别,在前面讲解任务控制块TCB_t的时候说了
在TCB_t中有两个变量xStateListItem和xEventListItem,这两个变量的类型就是ListItem_t,这两个成员变
量都是列表项。以xStateListItem为例,当创建一个任务以后xStateListItem的pvOwner变量就指向这个任
务的任务控制块,表示xStateListItem属于此任务。当任务就绪态以后xStateListItem的变量就指向pvContainer
就指向就绪列表,表明此列表项在就绪列表中。For example:小王在上二年级,他的父亲是老王。如果把
小王比作列表项,那么小王的pvOwner属性值就是老王,小王的pvContainer属性值就是二年级。

					列表项
					____________
					|xItemValue |
					____________
					|pxNext     |
					____________
					|pxPrevious |
					____________
					|pvOwner    |
					____________
					|pvContainer|
					_____________
					
					列表项示意图
					
		迷你列表项
struct xMINI_LIST_ITEM
			{
   
				listFIRST_LIST_INCLUDE_CHECK_VALUE					(1)
				configLIST_VOLATILE TickType_t			xItemValue;	(2)
				struct xLIST_ITEM *configLIST_VOLATILE	pxNext;		(3)
				struct xLIST_ITEM *configLIST_VOLATILE	pxPrevious;	(4)
				
			};
			typedef struct xLIST_ITEM	

(1)用来检查列表项完整性
(2)xItemvalue为列表项值
(3)pxNext指向下一个列表项
(4)pxPrevious指向前一个列表项,和pxNext配合起来实现类似双向链表的功能。

		可以看出迷你列表项只是比列表少了几个成员变量,迷你列表项有的成员变量列表项都有的,
	那为什么要弄个迷你列表项?那是因为有些情况下我们不需要列表项那么全的功能,可能只需要
	其中的某几个成员变量,如果此时用列表项的话会造成内存的浪费!如此上面里列表结构体List_t
	中表示最后一个列表项的成员变量xListEnd就是MiniListItem_t类型的。
					Mini列表项
					____________
					|xItemValue |
					____________
					|pxNext     |
					____________
					|pxPrevious |
					____________
				
					迷你列表项示意图
	

	列表和列表项初始化
		新创建或者定义的列表需要对其做初始化处理,列表的初始化其实就是初始化列表结构体
	List_t中的各个成员变量,列表的初始化通过使函数vListInitialise()来完成,此函数在
	list.c中有定义,函数如下:
void vListInitialise( List_t * const pxList )
			{
   
				/* The list structure contains a list item which is used to mark the
				end of the list.  To initialise the list the list end is inserted
				as the only list entry. */
				pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );				(1)		/*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is ch
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值