我在ucos下,在gps.h下定义如下数组用来接收串口数据 #ifdef GPS_GLOBALS #define GPS_EXT #else #define GPS_EXT extern #endif GPS_EXT INT8U gpsRevData【90】; 然后我调试时发现即使我没发数据,也意味着没对gpsRevData进行操作,但是watch里面可以看到数组的第一个字节数据一直在变化,查看memmory框如下图。然后如果串口传入数据后就出现了段错误。求解啊!!!!!!万能的论坛!!!! 串口接收: if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) { gpsRevData[gpsRevDataSub++] = (INT8U)(USART_ReceiveData(USART1)); if((gpsRevData[gpsRevDataSub-2] == 0x0d ) &&(gpsRevData[gpsRevDataSub-1] == 0x0a)); { //printf("%s",gpsRevData); gpsRevDataSub = 0; } } |
我使能的中断就两个,一个UART0口,一个外部中断用于按键触发的,按键中断处理函数并未对数组进行操作。然后我尝试着只定义这样一个数组,程序运行中不对其做任何操作,也就是没有任何函数调用这个数组,它的值还是会变,是不是操作系统中某些指针会指向那里然后又赋值之类的操作,裸机下是不会这样的
添加了,一直在变,即使没对它进行赋值
而且是只有gpsRevData【0】在两个值(具体哪两个忘了)之间重复转变,然后gpsRevData【1】为2,gpsRevData【3】为8一直不变,除非进入中断进行赋值了
你这个gpsRevDataSub++,岂不是每执行一次,gpsRevDataSub都要自加1?
还有 (INT8U)(USART_ReceiveData(USART1));没接收到数据,那么返回值是什么?是0吗?
当然要自加1啊,不然要数组干嘛,不加接收一个覆盖一个啊,接收的不是0,一串gps数据有近500个字节
我昨天试了下用ucos内存管理的内存申请方式定义了一个二维数组,然后再去get一个内存块,发现跟之前一样会自己变化,然后接收到数据就段错误,但是我发现之前定义的一维数组正常了,地址跟之前的不一样,之前的那块地址会变,现在被二维数组占用了,所以它有新的地址,然后新的地址正常。那块地址到底是怎么回事?如果复位后,那个一维数组会不会可能申请到那块会变的地址?那这样的话程序不就有时好有时坏,难道要我指定地址才行?谁来解释一下为什么
我昨天试了下用ucos内存管理的内存申请方式定义了一个二维数组,然后再去get一个内存块,发现跟之前一样会自己变化,然后接收到数据就段错误,但是我发现之前定义的一维数组正常了,地址跟之前的不一样,之前的那块地址会变,现在被二维数组占用了,所以它有新的地址,然后新的地址正常。那块地址到底是怎么回事?如果复位后,那个一维数组会不会可能申请到那块会变的地址?那这样的话程序不就有时好有时坏,难道要我指定地址才行?谁来解释一下为什么
我就是想不通,我写的部分确实没对其进行操作,那就只可能是操作系统了,我有空再调调看具体是哪些语句导致它变化的
问题已经找到了,是我自己创建任务时,任务堆栈的栈顶地址传错了