首页 >> 大全

FreeRTOS内部机制学习笔记二——任务调度机制

2024-01-04 大全 26 作者:考证青年

内部机制学习笔记二——任务调度机制 2.任务的创建

以下是创建任务线程的程序

/* Create the thread(s) */
/* definition and creation of LED_RED_Task */
osThreadDef(LED_RED_Task, StartLED_RED_Task, osPriorityNormal, 0, 128);
LED_RED_TaskHandle = osThreadCreate(osThread(LED_RED_Task), NULL);

相当于是将几个宏定义的参数拼接起来,其函数定义代码如下

#define osThreadDef(name, thread, priority, instances, stacksz)  

name:任务的名称;

:任务的函数名称;

:任务的优先级,这个与后面讲的任务调度有关;

:能够被实例化的最大数量,但是好像没啥作用;

:线程函数的堆栈大小要求(以字节为单位),也就是每个线程分配了固定大小的栈空间,这个大小与线程局部变量和调用深度有关(如果调用其他函数则需要将CPU中的LS寄存器压入栈中)。

则是实例化线程

osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)

:定义的线程;

调度机制方案_调度运行机制_

:为开始参数传递给线程函数的指针。

2.2 优先级与状态 线程有五种状态 2.3调度方法

根据任务的状态以及优先级,在中任务可以分为一下的一些状态

这里想说明一下何为被阻塞状态和被挂起状态,当执行到任务中的 ( )函数时,任务就会进入阻塞状态,而时间片将被分给处在准备运行的任务,直到时间达到,该任务才会进入准备运行状态,等待时间片的分配,同时其他的一些硬件阻塞也会使任务进入阻塞状态;有时不需要执行某些任务,可以通过 ( )函数将任务挂起,此事任务会处于被挂起状态,不会被分配到时间片,直到执行 ( )释放任务,此任务才会进入准备运行状态,等待时间片的分配。

**至于任务之间是怎样切换?**里面有一个Tick时钟,其是每1ms进入一次Tick中断里面,在中断里会将当前CPU的寄存器压入该任务分配的栈中,同会在列表里面寻找优先级最高的任务(如果同等优先级的任务,则轮流执行),将该任务的状态从栈中出栈到CPU寄存器并进行运行。

2.4抢占与礼让

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了