关于ucos的知识,目前是边做项目边加深理解,感觉还是有些欠缺,希望能从自己的代码经历中能总结出精髓。个人能力有限,编写边更新,难免有误,还望轻拍.
一、mailbox还是全局变量的问题
一般在任务间传递数据是采用mialbox,全局变量无法实现多任务按照时间片执行的目的。
设计的大概思想是:
中断接收,然后邮箱传递。目的任务去接收信息
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、如果每个字符串里面含有长度信息,乱码怎么清除长度
上一篇:UCOS2_STM32_任务间信号量通信(一)_应用实例描述
下一篇:STM32CubeMX学习笔记——FreeRTOS_任务创建与删除
推荐阅读最新更新时间:2024-11-08 15:59
设计资源 培训 开发板 精华推荐
- 以科技之力,成就安全 PI与您一起驾驭明天的智慧 答题赢好礼!
- 推陈出“芯“——TI 带你领略智能手机黑科技在线直播 预报名+看直播 好礼让你嗨翻全场!
- Nexperia ESD 应用手册|读 ESD 干货答题赢好礼
- 感恩十载 与你同在 EEWORLD十周年
- 看帖打卡赚现金:挑战21天学习freertos,打卡成长&赚外快
- ADI有奖直播:基准电压源产品技术及应用选择 7月25日上午10:00-11:30 不容错过~
- Altera Cyclone V 开发板全体验
- TI 中国大学计划20周年官网“幸运雨”了,你还不来抢?
- Vishay官方微信君驾到,扫码关注赢好礼
- 【团购】USB2.0学习板&BDM仿真器!