DS18B20在UCOSIII上跑出来值为0,但裸机却正常

2019-08-14 06:06发布

[mw_shl_code=c,true]#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "includes.h" #include "can.h" #include "beep.h" #include "lcd.h" #include "ds18b20.h" #include "dht11.h" #include "key.h" /************************************************ ALIENTEK????STM32??·?°?UCOS???é ??4-1 UCOSIII UCOSIII???? ?????§????www.openedv.com ??±??ê????http://eboard.taobao.com ??×????????????¨????????"??????×?"????·?????STM32×????? ?????????í??×????????????? ×÷??????????×? @ALIENTEK ************************************************/ short Stemp; u8 Shumidity; //?????????? #define START_TASK_PRIO 3 //?????????ó?? #define START_STK_SIZE 512 //?????????é OS_TCB StartTaskTCB; //???????? CPU_STK START_TASK_STK[START_STK_SIZE]; //???????? void start_task(void *p_arg); //?????????? #define CAN_TASK_PRIO 4 //?????????ó?? #define CAN_STK_SIZE 256 //?????????é OS_TCB CANTaskTCB; //???????? CPU_STK CAN_TASK_STK[CAN_STK_SIZE]; void CAN_task(void *p_arg); //?????????? #define WARING_TASK_PRIO 5 //?????????ó?? #define WARING_STK_SIZE 128 //?????????é OS_TCB WARINGTaskTCB; //???????? CPU_STK WARING_TASK_STK[WARING_STK_SIZE]; //???????? void WARING_task(void *p_arg); ////?????????? //#define FLOAT_TASK_PRIO 6 ////?????????ó?? //#define FLOAT_STK_SIZE 128 ////?????????é //OS_TCB FloatTaskTCB; ////???????? //__align(8) CPU_STK FLOAT_TASK_STK[FLOAT_STK_SIZE]; ////???????? //void float_task(void *p_arg); int main(void) { OS_ERR err; CPU_SR_ALLOC(); delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// uart_init(115200); LED_Init(); LCD_Init(); KEY_Init(); BEEP_Init(); //??????CAN?¤×÷???? CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN???????·??????,?¨????500Kbps OSInit(&err); OS_CRITICAL_ENTER(); OSTaskCreate((OS_TCB * )&StartTaskTCB, (CPU_CHAR * )"start task", (OS_TASK_PTR )start_task, (void * )0, (OS_PRIO )START_TASK_PRIO, (CPU_STK * )&START_TASK_STK[0], (CPU_STK_SIZE)START_STK_SIZE/10, (CPU_STK_SIZE)START_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_CRITICAL_EXIT(); OSStart(&err); while(1); } void start_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init(); #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); OSTaskCreate((OS_TCB * )&CANTaskTCB, (CPU_CHAR * )"CAN task", (OS_TASK_PTR )CAN_task, (void * )0, (OS_PRIO )CAN_TASK_PRIO, (CPU_STK * )&CAN_TASK_STK[0], (CPU_STK_SIZE)CAN_STK_SIZE/10, (CPU_STK_SIZE)CAN_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OSTaskCreate((OS_TCB * )&WARINGTaskTCB, (CPU_CHAR * )"WARING task", (OS_TASK_PTR )WARING_task, (void * )0, (OS_PRIO )WARING_TASK_PRIO, (CPU_STK * )&WARING_TASK_STK[0], (CPU_STK_SIZE)WARING_STK_SIZE/10, (CPU_STK_SIZE)WARING_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); OS_CRITICAL_EXIT(); } //CAN???????? void CAN_task(void *p_arg) { OS_ERR err; short mtemperature; u8 key; short temperature; u8 humidity; u8 define; u8 snum=0; u8 rnum=0; u8 t=0; u8 cnt=0; u8 canbuf[8]; u8 res; u8 mode=CAN_Mode_LoopBack; POINT_COLOR=DARKBLUE;// LCD_ShowString(30,30,200,16,16,"CAN AND DS18B20"); LCD_ShowString(30,50,200,16,16,"KEY0:Send WK_UP:Mode"); LCD_ShowString(30,90,200,16,16,"Send Data Count:"); LCD_ShowString(30,110,200,16,16,"DS18B20: . C"); POINT_COLOR=BLACK; LCD_ShowString(30,170,200,16,16,"Receive Data Count:"); LCD_ShowString(30,190,200,16,16,"Receive DS18b20: . C"); LCD_ShowString(30,230,200,16,16,"Receive DHT11: C"); LCD_ShowString(30,250,200,16,16,"Receive DHT11: %"); POINT_COLOR=RED; while(DS18B20_Init()) { LCD_ShowString(30,70,200,16,16,"DS18B20 Check Error"); delay_ms(200); LCD_Fill(92,10,239,10+16,WHITE); delay_ms(200); } LCD_ShowString(30,70,200,16,16,"DS18B20 Check OK"); while(1) { key=KEY_Scan(0); if(t%10==0) { POINT_COLOR=GREEN; mtemperature=DS18B20_Get_Temp();//就是这一步,mtemperature一直是0,但单独把这段程序拿出来在裸机跑,却可以正常显示。 if(mtemperature<0) { LCD_ShowChar(30+8*8,110,'-',16,0); mtemperature=-mtemperature; }else LCD_ShowChar(30+8*8,110,' ',16,0); LCD_ShowNum(30+9*8,110,mtemperature/10,2,16); //??????????·? LCD_ShowNum(30+9*8+32,110,mtemperature%10,1,16); //??????????·? } //·??????? key==KEY0_PRESS if(cnt==40)//KEY0°???,·??????????? { cnt=0; POINT_COLOR=LBBLUE; snum+=1; LCD_ShowNum(30+16*8,90,snum,3,16); canbuf[1]=mtemperature;//????·????????? canbuf[0]=1; //??±????? 1 is DS18B20,2 is DHT11 canbuf[2]=0; res=Can_Send_Msg(canbuf,3);//·???8??×??? POINT_COLOR= BRRED; if(res)LCD_ShowString(30,130,200,16,16,"DS18B20 Send Data Err"); //?á??·????§°? else LCD_ShowString(30,130,200,16,16,"DS18B20 Send Data Ok"); //?á??·??????? } //????CAN?¤×÷???? if(key==KEYUP_PRESS)//WK_UP°???????±?CAN???¤×÷???? { mode=!mode; CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//CAN???¨??????????, ?¨????500Kbps POINT_COLOR=RED;//?è??×??????ì?? if(mode==0)//???¨???????è??2????·?°? { LCD_ShowString(60,10,200,16,16,"Nnormal Mode "); }else //???·????,??????·?°?????????????. { LCD_ShowString(60,10,200,16,16,"LoopBack Mode"); } } //???????? key=Can_Receive_Msg(canbuf); if(key)//???????????? { POINT_COLOR=BLUE;//?è??×????????? rnum+=1; LCD_ShowNum(30+19*8,170,rnum,3,16); temperature=canbuf[1]; define=canbuf[0]; humidity=canbuf[2]; POINT_COLOR=GREEN; //??????DS18B20???? if(define==1) { LCD_ShowString(30,210,200,16,16,"DS18B20 Receive Data ok"); LCD_Fill(30+16*8,190,30+16*8+3*8,190+16,WHITE);//?????®?°?????? if(temperature<0) { LCD_ShowChar(30+16*8,190,'-',16,0); //???????? temperature=-temperature; //×??????? }else LCD_ShowChar(30+16*8,190,' ',16,0); //???????? LCD_ShowNum(30+17*8,190,temperature/10,2,16); //??????????·? LCD_ShowNum(30+17*8+32,190,temperature%10,1,16); //??????????·? LCD_ShowString(30,270,200,16,16,"DHT111 is Lost "); LCD_ShowNum(30+14*8,230,000,3,16); //???????? LCD_ShowNum(30+14*8,250,000,3,16); //???????? } //??????DHT11???? else if(define==2) { POINT_COLOR=BROWN; LCD_ShowString(30,270,200,16,16,"DHT11 Receive Data ok "); LCD_ShowNum(30+14*8,230,temperature,3,16); //???????? LCD_ShowNum(30+14*8,250,humidity,3,16); //???????? LCD_ShowNum(30+17*8,190,000,2,16); //??????????·? LCD_ShowNum(30+17*8+32,190,000,1,16); //??????????·? LCD_ShowString(30,210,200,16,16,"DS18B20 is Lost "); } } t++; OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //???±10ms if(t==20) { LED0=!LED0;//?á?????????????? t=0; cnt++; } } } ////WARING???????? void WARING_task(void *p_arg) { OS_ERR err; p_arg = p_arg; while(1) { //DS18B20?????ó??23??,·??ù?÷±¨?? if(Stemp/10>25) { OSTimeDlyHMSM(0,0,0,800,OS_OPT_TIME_HMSM_STRICT,&err); //???±800ms BEEP=1; OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //???±100ms BEEP=0; }else BEEP=0; // ????????DHT11???????ó??73%??LED1????±¨?? if(Shumidity>73) { OSTimeDlyHMSM(0,0,0,700,OS_OPT_TIME_HMSM_STRICT,&err); //???±700ms LED1=0; OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //???±100ms LED1=1; }else LED1=1; OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //???±500ms } } [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
jnfxt95
2019-08-14 08:15
一。裸机程序:循环程序模块串联执行,只有用户的中断程序,能随时打断循环程序的执行,编程相对简单。
二。UCOSII:时钟节拍中断,以及用户中断,以及高优先级任务,都能随时打断低优先级任务。
三。UCOSIII(中断的延迟发布模式):时钟节拍中断,以及用户中断,以及中断处理任务,以及时钟节拍任务,以及高优先级任务,都能随时打断低优先级任务。
四。在本例中,有中断处理任务以及时钟节拍任务,以及时钟节拍中断,以及用户中断,都能随时打断CAN_task()任务。虽然UCOSIII的中断响应时间及中断执行时间比UCOSII快,但是2个系统任务的执行时间延长了,从而使得用户级任务的等待时间延长了(因为系统任务的优先级高于用户任务,会随时打断用户任务)。DS18B20的读写时序要求比较严格,估计是他们打乱了读写时序时间吧?!建议在18B20读写函数(DS18B20_Read_Byte以及DS18B20_Write_Byte)的头尾,暂时加入开关调度器,试一试看。
五。今天(12月14日),测试了一下UCOSIII的时钟节拍中断执行时间为8~12us(系统中断级的延时)。另外还测试了从中断处理任务开始,到时钟节拍任务结束,再回到最高级用户任务的时间为80~150us(系统任务级对应用程序的延时)。所以UCOSIII系统对有严格时序要求程序的影响还是很严重的。
六。今天看了一下18B20的读写时序要求:主机写“1”时间最大15us,主机读“1”及读“0”时间最大15us,原子哥的主机读“1”及读“0”时间为14us,小于15us。所以在关键的代码段仅仅关调度是不行的,必须关中断才行。
七。虽然有时没有按照时序要求严格编写程序,器件也能工作,但未必可靠,会随着温度,器件批次,干扰环境等因素,造成器件工作的不稳定。

一周热门 更多>