stm32+ucosII建立串口通信等多任务的实现

来源:互联网 发布:jaya编程培训班 编辑:程序博客网 时间:2024/06/12 06:16

关于ucos的知识,目前是边做项目边加深理解,感觉还是有些欠缺,希望能从自己的代码经历中能总结出精髓。个人能力有限,编写边更新,难免有误,还望轻拍.

一、mailbox还是全局变量的问题

      一般在任务间传递数据是采用mialbox,全局变量无法实现多任务按照时间片执行的目的。


2017/8/24 更新

设计的大概思想是:

中断接收,然后邮箱传递。目的任务去接收信息

void USART1_IRQHandler(void)

    static unsigned char msg[512];

    unsigned int i;

    OS_CPU_SR  cpu_sr;

    OS_ENTER_CRITICAL();                         /* Tell uC/OS-II that we are starting an ISR          */

    OSIntNesting++;

    OS_EXIT_CRITICAL();


    if(USART_GetITStatus(USART1, USART_IT_RXNE )==SET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);

msg[Usart1_RXLen] = USART_ReceiveData(USART1);

Usart1_RXLen++;

                if(Usart1_RXLen==10)

{             

Usart1_RXLen=0;

OSMboxPost(AppUsart2Mbox,(void *)&msg); //把信息发出去

}       

}

if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) 

    USART_ClearFlag(USART1,USART_FLAG_ORE); //?SR 
USART_ReceiveData(USART1);


OSIntExit();                                 /* Tell uC/OS-II that we are leaving the ISR          */
}


任务执行

void Task_1_Usart1(void *p_arg)
{
    INT8U err;    
    unsigned char * msg;  
 
    (void)p_arg;
    while(1){  

OSTimeDlyHMSM(0, 0, 0, 20);

    msg=(unsigned char *)OSMboxPend(AppUsart2Mbox,0,&err);  
    if(msg[0]=='#' )
{

while(TxCounter < 10)
{
USART_SendData(USART1, msg[TxCounter++]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{}
}
TxCounter = 0;            
}
    } 
}

接收长度为10的字符串,字符串以#字符开始,判断完字头把数据发出。

思考:

1、如果数据长度不确定,怎么判定字符的结束。

2、如果每个字符串里面含有长度信息,乱码怎么清除长度


待续


原创粉丝点击