FreeRTOS初体验
本文最后更新于309 天前,其中的信息可能已经过时,如有错误请发送邮件到y.wt@foxmail.com

C语言基础

变量、结构体与指针

变量变量,能变,就是能读能写,必定在内存里面

指针指针,保存的是地址,32位处理器中地址是32位的,无论是什么类型的指针变量,都是4字节

  • 结构体是也一种数据类型
  • 指针是一个保存地址的变量

链表

链表结构的特点
链表的插入
  • 找出队列的最后一项
  • 将新插入的队列赋给最后一项的next
  • 将新插入的队列的next赋为NULL
void insert_spy(p_spy newspy)
{
	p_spy last;

	if (head == NULL)  //如果链表中仅有head一项
	{
		head = newspy;
		newspy->next = NULL;
	}
	else
	{
		/* 先找到链表的最后一项 last */
		last = head;
		while (last)
		{
			if (last->next == NULL) /* 找到了 */
				break;
			else
				last = last->next; //遍历
		}

		/*此时的last为已知的最后一项,将插入的newspy赋给最后一项的下一项*/
		last->next = newspy;
		newspy->next = NULL;    //newspy的下一项赋为NULL
	}
}
/*************************************************************************/
int main( void )
{
        /*插入队列*/
	insert_spy(&A);
	insert_spy(&B);
	insert_spy(&C);
	insert_spy(&D);


	head = &A;

	while (head)
	{
		printf("%s\r\n", head->name); //打印出每个队列
		head = head->next;            //直到head->next = NULL时跳出循环
	}

	while (1);

	return 0;
}
链表的删除
  • 找出待删除队列的上一项
  • 将待删队列的next赋给上一项的next
void remove_spy(p_spy oldspy)
{
	p_spy left;  //待删队列的上一项

	if (head == oldspy)    //如果待删队列是head的下一项
	{
		head = oldspy->next;
	}
	else
	{
		/* 找出oldspy的上线 */
		left = head;
		while (left)
		{
			if (left->next == oldspy)  //找到了上一项
				break;
			else
				left = left->next; //遍历
		}

		if (left)  //将待删队列的next赋给上一项的next:移除待删队列
		{
			left->next = oldspy->next;
		}
	}
}

数据结构基础

一块空闲的可管理的内存

FreeRTOS快速入门

任务管理

创建任务

任务创建

后创建的任务先执行

这里句柄(handle)可以理解为一个任务的唯一标识

一个任务函数可以创建多个不同任务,因为每个任务的栈是不同的,二者互不影响

任务函数示例

删除任务

void vTaskDelete( TaskHandle_t xTaskToDelete );

任务的优先级

FreeRTOS中优先级数字越小优先级越低

同优先级的两个任务交替运行

高优先级的任务没有主动放弃运行的话,低优先级任务无法执行

任务状态

1、运行状态(Running):正在运行的任务

2、就绪状态(Ready):等待高优先级任务(或同优先级)结束

3、阻塞状态(Blocked):当前任务释放CPU使用权

4、暂停(挂起)状态(Suspended):任务退出就绪列表

FreeRTOS中的任务也可以进入暂停状态,唯一的方法是通过vTaskSuspend函数。函数原型如下:

void vTaskSuspend( TaskHandle_t xTaskToSuspend );  //参数传入任务的句柄

要退出暂停状态,只能由别人来操作:

  • 别的任务调用:vTaskResume()
  • 中断程序调用:xTaskResumeFromISR()

完整的状态转换图

任务调度

1、可抢占调度:高优先级任务就绪时,就可以马上执行

2、(不可抢占)合作调度

优先级失去意义了,既然不能抢占就只能协商了,图中任务1一直在运行(一点都没有协

商精神),其他任务都无法执行。即使任务3的 vTaskDelay 已经超时、即使它的优先级更高,都没

办法执行。

3、时间片轮转:在Tick中断中会引起任务切换

4、时间片不轮转:高优先级任务就绪时会引起任务切换,高优先级任务不再运行时也会引起任务切

换。可以看到任务3就绪后可以马上执行,它运行完毕后导致任务切换。其他时间没有任务切换,

可以看到任务1、任务2都运行了很长时间。

5、空闲任务让步:在空闲任务的每个循环中,任务完成会主动让出CPU资源

6、空闲任务不让步:不让步时空闲任务跟任务1、任务2同等待遇,它们的波形宽度(运行时间)是差不多的

相关链接

韦东山嵌入式C语言进阶:https://www.bilibili.com/video/BV1VM4y137Pm/?spm_id_from=333.337.search-card.all.click&vd_source=113e5a6c10dbcf72a33c82d37090206c

堆栈的解释:https://www.bilibili.com/video/BV1P44y1q7uL/?spm_id_from=333.337.search-card.all.click&vd_source=113e5a6c10dbcf72a33c82d37090206c

韦东山FreeRTOS快速入门:https://www.bilibili.com/video/BV1844y1g7ud/?spm_id_from=333.337.search-card.all.click&vd_source=113e5a6c10dbcf72a33c82d37090206c

文章作者:Walter
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇