我在用cc2652的zigbee做无线传感器节点时,发现在Task中将ADC数据缓存到数组中时偶尔会导致系统死机,数组没有越界。
不知这是代码问题还是操作系统的问题。麻烦TI工程师帮忙解决一下。
typedef struct MsgObj {
uint16_t data[PACKAGE_LEN];
} MsgObj;
Void myTask_Fun(UArg a0, UArg a1) {//dacADC_Handleadc;ADC_Paramsparams;int_fast16_t res;static int count=0;//dataMsgObj msg;GPIO_init();ADC_init();ADC_Params_init(¶ms);adc = ADC_open(CONFIG_ADC_0, ¶ms);if (adc == NULL) {UART_write(uart,b1,sizeof(b1));while (1);}while(1){//采样if((GPIO_read(CONFIG_GPIO_1)==0)&&(GPIO_read(CONFIG_GPIO_2)==0)){res = ADC_convert(adc, &adcValue0);if (res == ADC_STATUS_SUCCESS) {msg.data[count]=adcValue0;//数组没有越界,但赋值偶尔会导致系统死机count++;}}if(count>=PACKAGE_LEN){sendflag=1;count = 0;Mailbox_post(mbxHandle, &msg, BIOS_NO_WAIT);Semaphore_post(appSemHandle);GPIO_toggle(CONFIG_GPIO_3);}Task_sleep(3 * (1000 / Clock_tickPeriod));} }
Viki Shi:
你有追踪过代码吗?是不是卡在这段了:
if (adc == NULL) {UART_write(uart,b1,sizeof(b1));while (1);}
Viki Shi:
推荐参考官方的ADC例程:dev.ti.com/…/node
Daoming Liu:
回复 Viki Shi:
您好,UART那里没有问题。确实在赋值部分出现问题,已经调试很多次了,只要有赋值那段就会偶尔出现死机。
YiKai Chen:
回复 Daoming Liu:
你MsgObj的結構定義可以貼上來看看嗎?
Daoming Liu:
回复 YiKai Chen:
typedef struct MsgObj { uint16_t data[PACKAGE_LEN]; } MsgObj; 您好,程序涉及到Task之间的数据传递。只要把数据放赋值到缓存数组就会偶尔出现死机情况。
YiKai Chen:
回复 Daoming Liu:
先不做msg.data[count]=adcValue0;這一行会不会出现死机情况?
Daoming Liu:
回复 YiKai Chen:
不会!
YiKai Chen:
回复 Daoming Liu:
看起來msg.data[count]=adcValue0;這一行不会有什麼問題才是,你程序涉及到Task之间的数据传的部份可以描述一下嗎?
Daoming Liu:
回复 YiKai Chen:
我在ADC采集Task中使用Mailbox_post(mbxHandle, &msg, BIOS_NO_WAIT)传递采集的数据到Zigbee Task,中使用Mailbox_pend(mbxHandle, &adcmsg, BIOS_WAIT_FOREVER)将传入的数据放到adcmsg中。
现在我改使用Queue进行数据传递,使用Queue_put和Queue_get API进行传递,还是有相同的问题,只要进行赋值就会出现问题。
YiKai Chen:
回复 Daoming Liu:
你把msg宣告成全域變數應該就不會有問題