FreeRTOS里面的线程叫任务,使用TCB(Task Control Block)来描述一个任务,每个任务有自己的栈空间。线程和线程调度是每一个操作系统里面相当关键的技术,本文通过FreeRTOS这个内核来阐述这两个知识点。 线程创建 每一个线程在创建的时候(xTaskGenericCreate)需要分配两个memory 一块memory是用来表示TCB,另外一块是用于新...
前言 资源: https://www.freertos.org/taskandcr.html 李柱明博客 3.1 任务概念 进程:进程是程序执行的过程,是程序在执行过程中分配和管理资源的基本单位。拥有独立的虚拟地址空间。 线程:线程是CPU调度和分派的基本单位。与其它同一进程的线程共享当前进程资源。
typedefstructxTASK_STATUS{/* The handle of the task to which the rest of the information in the structure relates. */TaskHandle_t xHandle;/* A pointer to the task's name.*/constchar*pcTaskName;/* A number unique to the task. */UBaseType_t xTaskNumber;/* The state in which the...
(14)、经过(12)和(13)得出阻塞时间没到,而且队列依旧是满的,那就调用函数VTaskPlaceOnEventList()将任务添加到队列的xTasksWaitingToSend列表中和延时列表中,并且将任务从就绪列表中移除。注意!如果阻塞时间是portMAX_DELAY并且宏INCLUDE_VTaskSuspend为1的话,函数vTaskPlaceOnEventList()会将任务添加到列表XSuspend...
线程往往不是相互独立的,需要不同的线程之间进行通信。在FreeRTOS中线程的通信可以使用信号量,互斥量,队列,邮箱,任务通知进行通信。 信号、信号量、互斥量用于进程之间的触发,但对进程间的数据交换无能为力。进程间数据交换最简单的方式是全局变量,但即使在简单的系统中,把握和灵活应用全局变量也是不小的挑战,因为全...
说到调度对象,很容易想起那句名言:进程是资源的最小单位,线程是调度的最小单位。在 FreeRTOS 中没有区分进程,线程的概念,统称为任务,对应的结构体为:tskTCB。 lib/FreeRTOS/tasks.c:typedefstructtskTaskControlBlock{volatileStackType_t*pxTopOfStack;/*栈顶指针*/ListItem_txStateListItem;/*状态链表*/ListIte...
绝大部分嵌入式系统没有虚拟地址的概念,FreeRTOS里的Task没有自己的地址空间表。从操作系统的概念来说,FreeRTOS的Task更像是线程,而不是进程。但无论线程还是进程,都需要维护自身的代码堆栈,保证函数调用结构的完整。 任务TCB TCB_t中定义了任务相关的控制信息,包括: ...
在线程模式下,可以使用主堆栈也可以使用进程栈。 由CONTROL 寄存器控制,如下: PendSV和SVC异常 PendSV异常用于任务切换。 为了保证操作系统的实时性,除了使用Systick的时间片调度,还得加入pendSV异常加入抢占式调度。 PendSV(可挂起的系统调用),异常编号为14,可编程。可以写入中断控制和状态寄存器(ICSR)设置挂起位以...
线程往往不是相互独立的,需要不同的线程之间进行通信。在FreeRTOS中线程的通信可以使用信号量,互斥量,队列,邮箱,任务通知进行通信。 信号、信号量、互斥量用于进程之间的触发,但对进程间的数据交换无能为力。进程间数据交换最简单的方式是全局变量,但即使在简单的系统中,把握和灵活应用全局变量也是不小的挑战,因为全...
FreeRTOS也是如此,所有的Task都运行在同一个地址空间下,更像是线程,不是进程。 在内存管理方面,FreeRTOS只提供了一些Heap模块,方便用户动态申请内存。 0人点赞 逆解FreeRTOS 更多精彩内容,就在简书APP "小礼物走一走,来简书关注我" 赞赏支持还没有人赞赏,支持一下 ...