初级会员

- 积分
- 65
- 金钱
- 65
- 注册时间
- 2020-7-15
- 在线时间
- 47 小时
|
10金钱
采用的STM32F7,使用UCOS,设了两个任务,一个任务接收串口数据,然后存FIFO,第二个任务从FIFO中取数据并存SD卡,两个任务优先级一样,这样的结果是,程序一直在第一个串口接收的任务中执行,第二个任务的能执行的时间特别少。
下面是两个任务的代码
void gnssreceive_task(void *p_arg){
u8 num=0;
u16 i=0;
CPU_SR_ALLOC();
u8 res_gnss_nmea,res_gnss_oem,res_ub482_oem;
u16 rxlen;
OS_ERR err;
u8 receive[8000];
UB482Buffer ub482write;
while (1)
{
if((USART1_RX_STA&0X8000)) //接收到一次数据了
{
OS_CRITICAL_ENTER();
rxlen=USART1_RX_STA&0X7FFF; //得到数据长度
for(i=0;i<rxlen;i++) ub482write.RANGEA=USART1_RX_BUF;
USART1_RX_STA=0; //启动下一次接收
ub482write.RANGEA=0; //自动添加结束符
//printf("%s",ub482write.RANGEA);
OS_CRITICAL_ENTER();
res_ub482_oem = Write_RingBuff_UB482_OEM(ub482write);
OS_CRITICAL_EXIT();
printf("%d",ringBuffub482oem.Lenght);
if(res_gnss_oem == 0)
printf("write ub482 range data ok******************************\n\r");
memset(ub482write.RANGEA,0,8000);
}
OSSchedRoundRobinYield(&err);
}
}
void gnsssave_task(void *p_arg){
printf("save start ----------------------\n\r");
u8 fru,fr1u,fr2u,fr3u;//存ub482-的文件相关返回值
OS_ERR err;
CPU_SR_ALLOC();
fru = f_open(fgnssoem,(const TCHAR*)"0:/GNSS_OEM_UB482.dat",FA_READ|FA_WRITE);//先不加创建选项
if(fru == FR_NO_FILE) //当返回无文件时,再进行创建文件
f_open(fgnssoem,(const TCHAR*)"0:/GNSS_OEM_UB482.dat",FA_READ|FA_WRITE|FA_CREATE_NEW);
while(1){
if(ringBuffub482oem.Lenght>=1){
printf("save ----------------------\n\r");
OS_CRITICAL_ENTER();
fr1u = f_lseek(fgnssoem, f_size(fgnssoem));
fr2u = f_write(fgnssoem,&(ringBuffub482oem.Ring_Buff_UB482_Oem[ringBuffub482oem.Head]),strlen(ringBuffub482oem.Ring_Buff_UB482_Oem[ringBuffub482oem.Head].RANGEA),&bw);
ringBuffub482oem.Head = (ringBuffub482oem.Head+1)%RINGBUFF_LEN;//防止越界非法访问
ringBuffub482oem.Lenght--;
fr3u = f_sync(fgnssoem);
OS_CRITICAL_EXIT();
if(fr1u==0&&fr2u==0&&fr3u==0){
printf("save gnss ub482 oem data ok&&&&&&&&&&&&&&&&&&&&&%d-%d-%d\n\r",fr1u,fr2u,fr3u);
LED0_Toggle;
}
else{
printf("gnss data ub482 save error!!!!!!!!!!!!!--%d-%d-%d\n\r",fr1u,fr2u,fr3u);
}
}
OSSchedRoundRobinYield(&err);
}
}
|
|