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

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个回答
wamcncn 回答时间: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一直不变,除非进入中断进行赋值了
wamcncn 回答时间: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
haihuang-402384 回答时间:2014-12-23 09:33:12
晓枫VS枯叶 发表于 2014-12-22 16:40
楼主可以把gpsRevData添加到watch窗口看看到底这个数组里面的数值是否发生变化! ...

我昨天试了下用ucos内存管理的内存申请方式定义了一个二维数组,然后再去get一个内存块,发现跟之前一样会自己变化,然后接收到数据就段错误,但是我发现之前定义的一维数组正常了,地址跟之前的不一样,之前的那块地址会变,现在被二维数组占用了,所以它有新的地址,然后新的地址正常。那块地址到底是怎么回事?如果复位后,那个一维数组会不会可能申请到那块会变的地址?那这样的话程序不就有时好有时坏,难道要我指定地址才行?谁来解释一下为什么
321.png
小贾-370388 回答时间:2014-12-23 14:09:10
按理说是不应该的,定义数组后会由系统自动分配内存的,分配的内存不会冲突的,除非是你那里操作了这个地址
haihuang-402384 回答时间:2014-12-23 14:36:52
小贾-370388 发表于 2014-12-23 14:09
按理说是不应该的,定义数组后会由系统自动分配内存的,分配的内存不会冲突的,除非是你那里操作了这个地址 ...

我就是想不通,我写的部分确实没对其进行操作,那就只可能是操作系统了,我有空再调调看具体是哪些语句导致它变化的
damiaa 回答时间:2015-1-4 14:17:55
内存溢出, 数组出界 你在这两者之间找问题。那个数组的gpsRevDataSub要在调用之前判断一下是否小于90-1 ,然后调用 gpsRevData[gpsRevDataSub++]
haihuang-402384 回答时间:2015-1-6 10:57:30
damiaa 发表于 2015-1-4 14:17
内存溢出, 数组出界 你在这两者之间找问题。那个数组的gpsRevDataSub要在调用之前判断一下是否小于90-1 , ...

问题已经找到了,是我自己创建任务时,任务堆栈的栈顶地址传错了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版