freeRTOSy应用总结(二)

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);
    }
   
}

要去抓紧整专利了,先写这些吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值