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同等待遇,它们的波形宽度(运行时间)是差不多的
相关链接
韦东山FreeRTOS快速入门:https://www.bilibili.com/video/BV1844y1g7ud/?spm_id_from=333.337.search-card.all.click&vd_source=113e5a6c10dbcf72a33c82d37090206c