FreeRTOS内核浅析(一)

本文深入解析了FreeRTOS的任务创建过程,从xTaskCreate到xTaskCreatePinnedToCore,详细阐述了任务栈和任务控制块的创建、栈顶位置计算以及任务的优先级设置。同时,介绍了FreeRTOS的信号量管理,包括创建、释放和获取信号量的内部机制,以及任务在等待和释放信号量时如何进行阻塞和唤醒操作。
摘要由CSDN通过智能技术生成

1. 源码

1.1. task

任务的创建



/* xTaskCreate实际调用xTaskCreatePinnedToCore */
xTaskCreate
    xTaskCreatePinnedToCore
	    /* 任务栈pxStack和任务控制块pxNewTCB创建 */
		pvPortMallocStackMem

		prvInitialiseNewTask
		    /* 计算栈顶pxTopOfStack位置 */
			/* 存储任务名到TCB */
			/* 确定任务优先级 */
			/* 初始化列表项 */
			vListInitialiseItem
            listSET_LIST_ITEM_OWNER
			listSET_LIST_ITEM_VALUE
			/* 根据芯片架构初始化栈帧 */
			pxPortInitialiseStack
		        sp-->interrupt stack frame
				...

		prvAddNewTaskToReadyList
		    prvAddTaskToReadyList
			    /* 按照任务优先级,添加到对应的pxReadyTasksLists */
			    vListInsertEnd
				    /* 新的任务添加到pxIndex的前面,任务列表的遍历是从pxIndex开始,所以认为pxIndex的前面就是尾部 */
			

开启任务


vTaskStartScheduler
    /* 创建空闲任务 prvIdleTask*/

	xPortStartScheduler
	
1.2. 信号量

创建
xSemaphoreCreateCounting=xQueueCreateCountingSemaphore

xQueueCreateCountingSemaphore
    xQueueGenericCreate
	1.计算所需队列字节数并申请内存
	2.初始化新队列
	    prvInitialiseNewQueue
	3.返回新队列指针
	4.关键变量值
	uxItemSize = queueSEMAPHORE_QUEUE_ITEM_LENGTH = 0;
	uxLength = uxMaxCount=3
	uxMessagesWaiting = uxInitialCount;
	uxQueueType = queueQUEUE_TYPE_COUNTING_SEMAPHORE

释放
xSemaphoreGive = xQueueGenericSend

xQueueGenericSend
    prvCopyDataToQueue
	    判断了一堆,由于uxItemSize==0,最后uxMessagesWaiting+1返回

获取
xSemaphoreTake = xQueueSemaphoreTake

xQueueSemaphoreTake
    同样也是在临界区内判断,当前可后去的信号量是否还有,也就是uxMessagesWaiting的值不为0
	uxMessagesWaiting-1
	执行在等待该信号量的阻塞中的任务(even list)
	如果等不到信号,超时,就把当前任务的xEventListItem加到当前信号的xTasksWaitingToSend中(释放也有同样操作)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值