请教各位专家:
我想在COLLECTOR.C 历程中调用50MS 的延迟函数,通过查询发现很多函数能实现,例如 SLEEP ,task_sleep , CPUdelay(8000*50);
如下问题:
1、请教延迟函数除上诉函数以外还有哪些延迟函数,它们的功能如何定义,在应用上有何区别
2、在COLLECTOR.C 中有进程和任务的调度,应该用哪种延迟函数合适。
Kevin Qiu1:
CPUdelay使用delay loop来实现延时,其延时单位为指令周期。
//*****************************************************************************////! \brief Provide a small delay.//!//! This function provides means for generating a constant length delay. It//! is written in assembly to keep the delay consistent across tool chains,//! avoiding the need to tune the delay based on the tool chain in use.//!//! The loop takes 3 cycles/loop.//!//! \param ui32Count is the number of delay loop iterations to perform.//!//! \return None////*****************************************************************************extern void CPUdelay(uint32_t ui32Count);
Task_sleep是让出对MCU的占用,可以让其他task得到执行或者执行idle task从而进入低功耗状态。它的计时单位是systick,默认为10us。
Sleep()函数的作用仅仅是让程序停止运行一段时间
自由飞翔:
回复 Viki Shi:
csf.c
void Csf_deviceSensorDataUpdate(ApiMac_sAddr_t *pSrcAddr, int8_t rssi,
Smsgs_sensorMsg_t *pMsg)
{
Board_Led_toggle(board_led_type_LED2);
LCD_WRITE_STRING_VALUE("Sensor 0x", pSrcAddr->addr.shortAddr, 16, 6);
LCD_WRITE_STRING_VALUE("csf.c:receive_data[667]", pMsg->SensorAlarm.AlarmMessageHead, 8, 6);
LCD_WRITE_STRING_VALUE("csf.c:receive_data[667]", pMsg->SensorAlarm.AlarmMessageNo, 8, 6);
LCD_WRITE_STRING_VALUE("csf.c:receive_data[667]", pMsg->SensorAlarm.AlarmMessageType, 8, 6);
LCD_WRITE_STRING_VALUE("csf.c:receive_data[667]", pMsg->SensorAlarm.AlarmMessageUnit, 8, 6);
LCD_WRITE_STRING_VALUE("csf.c:receive_data[667]", pMsg->SensorAlarm.AlarmMessageAction, 8, 6);
LCD_WRITE_STRING_VALUE("csf.c:receive_data[667]", pMsg->SensorAlarm.AlarmMessageTail, 8, 6);
Gsm_CallPhone("xxxxxxxxxxxxxxxxx"); //调用用户函数 其中执行了 TASK_SLEEP 函数
#if defined(MT_CSF)
MTCSF_sensorUpdateIndCB(pSrcAddr, rssi, pMsg);
#endif
}
bool Gsm_CallPhone(unsigned char *TargetPhoneText)
{
unsigned char CodeStr[30]={'\0'}; //接收数据缓冲区
// RebackBuf=buf;
sprintf((char *)CodeStr,"%s%s;\r\n",F_ORDER_ATD,TargetPhoneText);
// LcdShowStr(0, 0, " ");
//LcdShowStr(0, 0, CodeStr);
UartWrite_TC35(CodeStr, strlen((const char *)CodeStr),30,F_REBACK_STR);//发送用户信息内容。
Task_sleep(20);
UART_write(hUart, F_ORDER_ATH, sizeof(F_ORDER_ATH)-1);
//LcdShowStr(0, 1, " ");
//LcdShowStr(0, 1,"CALL PHONE");
return true;
}
Viki Shi:
回复 自由飞翔:
Gsm_CallPhone 这不是例程代码吧?csf.c里没找到这个函数
自由飞翔:
回复 Viki Shi:
这是我自己写的函数
Viki Shi:
回复 自由飞翔:
建议callback里不要用task_sleep