1.挂起和恢复与删除和创建的区别是会保存堆栈和任务控制块内存
void key_task(void *pvParameters)
{
u8 flag = 0;
while(1)
{
flag = KEY_Scan(0);
switch (flag)
{
case KEY0_PRES:
vTaskSuspend(Task1Task_Handler);
printf("任务1已挂起!");break;
case KEY1_PRES:
vTaskResume(Task1Task_Handler);
printf("任务1已恢复!");break;
case KEY2_PRES:
vTaskSuspend(Task2Task_Handler);
printf("任务2已挂起!");break;
}
vTaskDelay(10);
}
}
2.任务恢复有直接恢复和中断恢复,中断恢复会判断此时优先级,高于正在运行的任务时会启用任务调度。
具体操作为:
这是一个外部中断触发中断
void EXTI9_5_IRQHandler(void)
{
BaseType_t YieldRequired;
delay_xms(20); //消抖
if(KEY3==0)
{
YieldRequired=xTaskResumeFromISR(Task2Task_Handler);//恢复任务2
printf("恢复任务2的运行!\r\n");
if(YieldRequired==pdTRUE)
{
/*如果函数xTaskResumeFromISR()返回值为pdTRUE,那么说明要恢复的这个
任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务),所以在
退出中断的时候一定要进行上下文切换!*/
portYIELD_FROM_ISR(YieldRequired);
}
}
EXTI_ClearITPendingBit(EXTI_Line6);//清除LINE4上的中断标志位
3.列表相当于链表,列表项相当于里面的节点
List_t stTestList;
ListItem_t stListItem1;
ListItem_t stListItem2;
ListItem_t stListItem3;
要用列表,必须先在主函数前添加列表的结构体与列表项的结构体
4.往列表中添加列表项,有两种方式:1根据列表项值大小进行排序添加 2在列表末尾添加(此时列表的索引指向的列表项为表头)默认情况下迷你列表项为表头(LasTENd)
void list_task(void *pvParameters)
{
vListInitialise( &stTestList );
vListInitialiseItem( &stListItem1 );
vListInitialiseItem( &stListItem2 );
vListInitialiseItem( &stListItem3 );
stListItem1.xItemValue = 20; //列表项值
stListItem2.xItemValue = 30;
stListItem3.xItemValue = 25;
printf("/*******************列表和列表项地址*******************/\r\n");
printf(" 项目 地址 \r\n");
printf(" stTestList %#x \r\n",(int)&stTestList);
printf(" stTestList->pxIndex %#x \r\n",(int)stTestList.pxIndex);
printf(" stTestList->xListEnd %#x \r\n",(int)&stTestList.xListEnd);
printf(" stListItem1 %#x \r\n",(int)&stListItem1);
printf(" stListItem2 %#x \r\n",(int)&stListItem2);
printf(" stListItem3 %#x \r\n",(int)&stListItem3);
printf("/**************************结束************************/\r\n");
//insert ListItems
vListInsert( &stTestList, &stListItem1 );
printf("/*******************列表和列表项地址*******************/\r\n");
printf(" 项目 地址 \r\n");
printf(" stTestList->xListEnd->pxNext %#x \r\n",(int)stTestList.xListEnd.pxNext);
printf(" stListItem1->xListEnd->pxNext %#x \r\n",(int)stListItem1.pxNext);
printf("/**************************结束************************/\r\n");
vListInsert( &stTestList, &stListItem2 );
printf("/*******************列表和列表项地址*******************/\r\n");
printf(" 项目 地址 \r\n");
printf(" stTestList->xListEnd->pxNext %#x \r\n",(int)stTestList.xListEnd.pxNext);
printf(" stListItem1->pxNext %#x \r\n",(int)stListItem1.pxNext);
printf(" stListItem2->pxNext %#x \r\n",(int)stListItem2.pxNext);
printf("/**************************结束************************/\r\n");
vListInsert( &stTestList, &stListItem3 );
printf("/*******************列表和列表项地址*******************/\r\n");
printf(" 项目 地址 \r\n");
printf(" stTestList->xListEnd->pxNext %#x \r\n",(int)stTestList.xListEnd.pxNext);
printf(" stListItem1->pxNext %#x \r\n",(int)stListItem1.pxNext);
printf(" stListItem2->pxNext %#x \r\n",(int)stListItem2.pxNext);
printf(" stListItem3->pxNext %#x \r\n",(int)stListItem3.pxNext);
printf("/**************************结束************************/\r\n");
uxListRemove(&stListItem2);
printf("/*******************列表和列表项地址*******************/\r\n");
printf(" 项目 地址 \r\n");
printf(" stTestList->xListEnd->pxNext %#x \r\n",(int)stTestList.xListEnd.pxNext);
printf(" stListItem1->pxNext %#x \r\n",(int)stListItem1.pxNext);
printf(" stListItem3->pxNext %#x \r\n",(int)stListItem3.pxNext);
printf("/**************************结束************************/\r\n");
vListInsertEnd( &stTestList, &stListItem2 );
printf("/*******************列表和列表项地址*******************/\r\n");
printf(" 项目 地址 \r\n");
printf(" stTestList->xListEnd->pxNext %#x \r\n",(int)stTestList.xListEnd.pxNext);
printf(" stListItem1->pxNext %#x \r\n",(int)stListItem1.pxNext);
printf(" stListItem2->pxNext %#x \r\n",(int)stListItem2.pxNext);
printf(" stListItem3->pxNext %#x \r\n",(int)stListItem3.pxNext);
printf("/**************************结束************************/\r\n");
uxListRemove(&stListItem2);
stTestList.pxIndex = stTestList.pxIndex->pxNext;
vListInsertEnd( &stTestList, &stListItem2 );
printf("/*******************列表和列表项地址*******************/\r\n");
printf(" 项目 地址 \r\n");
printf(" stTestList->xListEnd->pxNext %#x \r\n",(int)stTestList.xListEnd.pxNext);
printf(" stListItem1->pxNext %#x \r\n",(int)stListItem1.pxNext);
printf(" stListItem2->pxNext %#x \r\n",(int)stListItem2.pxNext);
printf(" stListItem3->pxNext %#x \r\n",(int)stListItem3.pxNext);
printf("/**************************结束************************/\r\n");
while(1)
{
LED2 = !LED2;
vTaskDelay(1);
LED2 = !LED2;
vTaskDelay(1);
}
}
要去抓紧整专利了,先写这些吧