你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32在UCOS下定义数组问题

[复制链接]
haihuang-402384 提问时间:2014-12-20 17:27 /
我在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;
        }
}


mem.png
<
收藏 评论14 发布时间:2014-12-20 17:27

举报

14个回答
wambob 回答时间:2014-12-22 13:08:26
你的串口接收判断中断产生,如果有就进行接收数据,是不是别的地方产生了中断,导致你提前接收到了数据,等到真正接收数据时,中断标志复位了呢?
haihuang-402384 回答时间:2014-12-22 13:55:04
wambob 发表于 2014-12-22 13:08
你的串口接收判断中断产生,如果有就进行接收数据,是不是别的地方产生了中断,导致你提前接收到了数据,等到真 ...

我使能的中断就两个,一个UART0口,一个外部中断用于按键触发的,按键中断处理函数并未对数组进行操作。然后我尝试着只定义这样一个数组,程序运行中不对其做任何操作,也就是没有任何函数调用这个数组,它的值还是会变,是不是操作系统中某些指针会指向那里然后又赋值之类的操作,裸机下是不会这样的
晓枫VS枯叶 回答时间:2014-12-22 16:40:29
楼主可以把gpsRevData添加到watch窗口看看到底这个数组里面的数值是否发生变化!
haihuang-402384 回答时间:2014-12-22 17:02:19
晓枫VS枯叶 发表于 2014-12-22 16:40
楼主可以把gpsRevData添加到watch窗口看看到底这个数组里面的数值是否发生变化! ...

添加了,一直在变,即使没对它进行赋值
haihuang-402384 回答时间:2014-12-22 17:05:22
晓枫VS枯叶 发表于 2014-12-22 16:40
楼主可以把gpsRevData添加到watch窗口看看到底这个数组里面的数值是否发生变化! ...

而且是只有gpsRevData【0】在两个值(具体哪两个忘了)之间重复转变,然后gpsRevData【1】为2,gpsRevData【3】为8一直不变,除非进入中断进行赋值了
wambob 回答时间:2014-12-22 20:03:07
给数组赋值0试试
奔跑小蜗牛 回答时间:2014-12-23 08:42:51
  gpsRevData[gpsRevDataSub++] = (INT8U)(USART_ReceiveData(USART1));
你这个gpsRevDataSub++,岂不是每执行一次,gpsRevDataSub都要自加1?
还有 (INT8U)(USART_ReceiveData(USART1));没接收到数据,那么返回值是什么?是0吗?
haihuang-402384 回答时间:2014-12-23 08:46:51
奔跑小蜗牛 发表于 2014-12-23 08:42
gpsRevData[gpsRevDataSub++] = (INT8U)(USART_ReceiveData(USART1));
你这个gpsRevDataSub++,岂不是每 ...

当然要自加1啊,不然要数组干嘛,不加接收一个覆盖一个啊,接收的不是0,一串gps数据有近500个字节
haihuang-402384 回答时间:2014-12-23 09:32:43
晓枫VS枯叶 发表于 2014-12-22 16:40
楼主可以把gpsRevData添加到watch窗口看看到底这个数组里面的数值是否发生变化! ...

我昨天试了下用ucos内存管理的内存申请方式定义了一个二维数组,然后再去get一个内存块,发现跟之前一样会自己变化,然后接收到数据就段错误,但是我发现之前定义的一维数组正常了,地址跟之前的不一样,之前的那块地址会变,现在被二维数组占用了,所以它有新的地址,然后新的地址正常。那块地址到底是怎么回事?如果复位后,那个一维数组会不会可能申请到那块会变的地址?那这样的话程序不就有时好有时坏,难道要我指定地址才行?谁来解释一下为什么
321.png
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版