TA的每日心情 | 开心 2018-1-8 15:51 |
---|
签到天数: 22 天 连续签到: 1 天 [LV.4]偶尔看看III
|
发表于 2014-5-28 20:48:18
|
显示全部楼层
清楚了,故事是这样的....
现在已从用户Q群得知你的自检程序是正常的,因此硬件是正常的。
这个例子是为学习UCOS的任务挂起OSTASKSuspend和恢复的OSTaskResume
说明在MAIN.c中,如下:
/*实验 基于信号量的多任务循环缓冲数据采集处理实验
需求说明:
1.远程采集终端12位AD采集7路模拟量,每500毫秒左右将数据通过串口下面的格式送本机
0xFA 0xFB D7H D7L D6H D6L D5H D5L D4H D4L D3H D3L D2H D2L D1H D1L 0xFE 0xFE
例如:FA FB 00 01 00 02 00 03 00 04 00 05 00 06 00 07 FE FE
D7H表示路7的高8位,D7L表示路7的低8位,D7H的高4位全为0。
2.远程采集终端具有过流保护功能,在发生过流的时候,通过串口发送以下数据格式到本机
0xFA 0xF4 TYPE 0xFE 0xFE
保护解除后再发一组数据
其中,TYPE的位0、位1、位2表示三个电源过流.高有效。
3.数据接收后,将电压值显示在屏幕上。发生过流,
点亮对应LED
分析:因为数据长度不能确定,所以不采能用实验24的方法
考虑采用循环缓冲区来
建立一个100个字节的缓冲,用P1指示下一个接收的位置,P2指示当前需要提取数据的位置
如 01 02 03 04 空 空 空
P2 P1
如果P1==P2则数据都已经处理
解决方案:采用UCOS多任务机制和循环缓冲,建立以下任务:
串口中断函数向缓冲区填充接收到的数据
数据处理任务分析缓冲区,根据缓冲区中的数据判断接收到的数据的类型,处理完毕,让显示任务来更新显示
显示任务负责更新显示,包括屏幕和LED
测试的时候采用串口调试助手,以100毫秒周期发送数据包,严格于项目要求的500毫秒,将取得的数据送回,接收到
过流保护信息包时查看LED的亮灭
*/
主程序构建了以下几个任务:
int main(void){
INT8U os_err;
os_err=os_err;
pput=USART1_BUF;
pget=USART1_BUF;
BUFEXCEED=USART1_BUF+RECEBUFSIZE;
bpboard_init();//硬件初始化
//bp_selfcheck(1);
OSInit(); //³õʼ»¯UCOS
os_err = OSTaskCreate((void (*)(void *)) App_TaskStart, // 启动任务
(void * ) 0,
(OS_STK * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],
(INT8U ) APP_TASK_START_PRIO); //ÓÅÏȼ¶3£¬×î¸ß
os_err = OSTaskCreate((void (*)(void *)) App_TaskDisp, /* 显示任务
(void * ) 0,
(OS_STK * )&App_TaskDispStk[APP_TASK_DISP_STK_SIZE - 1],
(INT8U ) APP_TASK_DISP_PRIO);
os_err = OSTaskCreate((void (*)(void *)) App_TaskProc, /* 处理任务
(void * ) 0,
(OS_STK * )&App_TaskProcStk[APP_TASK_PROC_STK_SIZE - 1],
(INT8U ) APP_TASK_PROC_PRIO);
OSStart();
return(0);
}
启动任务在设置好时钟滴答后就阻塞了,也可以选择删除自己,因此问题跟其无关
处理任务和现实任务代码较长,对照代码来看
处理任务第一次运行时,因为没有接收到数据,缓冲区为空,因此调用
OSTaskSuspend(OS_PRIO_SELF); 挂起自己
当然,显示任务也是这样
因此,没有给串口喂数据,当然没有显示了
再看串口中断服务程序
void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò
{
u8 currentget;
OSIntEnter();
currentget=USART1->DR ;
*pput++ = currentget;
if (pput==BUFEXCEED)//Êý×éµØÖ·Ô½½ç
pput=USART1_BUF;
if ((lastget==0xFE)&&(currentget==0xFE))
{OSTaskResume(APP_TASK_PROC_PRIO);} //Èç¹û½ÓÊÕµ½Á¬ÐøµÄFEÔò±íʾ½ÓÊÕµ½Ò»×éÓÐЧµÄÊý¾Ý
lastget=currentget;
OSIntExit();
}
现在就清楚了吧,如果接收到完整的一组数据 以0XFE0XFE结尾,我们才需要处理,才OSTaskResume(APP_TASK_PROC_PRIO);
因此,你说的不显示是正常的,按代码的说明发数据到串口1即可。
|
|