打印
[技术问答]

新唐m0奇葩问题 数组过大程序无法运行

[复制链接]
5351|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gcxzhz|  楼主 | 2014-3-21 00:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gcxzhz 于 2014-3-22 17:06 编辑

用来做的旋转led
用m0516的主控芯片   只是操作io口   
首先保证数据不会超过芯片rom
数组过大程序无法运行,假设临界值为n  数组1的大小n1超过 n 则程序无法运行,  n1《 n时可以运行,数组2的大小为n2,当n1+n2》  n时函数,仍无法运行,函数执行两次。当2×n1 》n时  调用两次 芯片仍然无法运行

具体如下
void roll_left(uint16_t *p,uint16_t size)

运行 roll_left(wfcsu,wfcsu_size);  wfcsu是个数组 ,我用的指针表示 。  wfcsu_size是数组wfcsu的大小
当wfcsu_size  》n(临界值)函数无法运行,
wfcsu1也是个数组 。  wfcsu1_size是数组wfcsu1的大小
当  wfcsu1_size +  wfcsu_size 》n时
roll_left(wfcsu,wfcsu_size);  
roll_left(wfcsu1,wfcsu1_size);  
芯片无法运行
单独运行其中一个没问题
当  wfcsu1_size +  wfcsu_size 《n时
两个都没问题

本来都验证好了。函数也调好了,硬件准备封装的时候,手残增大数组数据后  就出现问题了

int main(void)
{  
   
     SYS_Init();    //初始化
     IO_Init();
     P1->DOUT = 0;   //点亮上下显示的蓝灯
       delaytime=65535;
    while(    delaytime--);

            while(1)
        {
      P2->DOUT = 0xff;
          P0->DOUT = 0xff;
          delaytime=65535;
            while(    delaytime--);
            while(1)
            {
   
                //下面是花样显示函数
        //函数都是经过测试,按照自己预期的结果运行的
          roll_up(wfcsu1,wfcsu1_size);
          flash(wfcsu1,wfcsu1_size);
          roll_left(wfcsu,wfcsu_size);                //wfcsu是个数组  wfcsu_size是数组大小   以下同样
        roll_left(wfcsu5,wfcsu5_size);
         roll_left(wfcsu1,wfcsu1_size);
        }
    }        
}
   

上面是主函数   最下面3行 单独运行其中任何一个都没问题  
运行roll_left(wfcsu,wfcsu_size);               
        roll_left(wfcsu5,wfcsu5_size);
因为wfcsu5_size+wfcsu_size > n了不行
运行roll_left(wfcsu,wfcsu_size);               
        roll_left(wfcsu1,wfcsu1_size);
  或  
运行roll_left(wfcsu1,wfcsu1_size);               
        roll_left(wfcsu5,wfcsu5_size);
因为wfcsu5_size+wfcsu1_size<n
       wfcsu_size+wfcsu1_size<n  都可以正常运行
      
下面是现有成果
蓝色的是锂电池充电板 红色那个是升压板都是买的现成的  其他是自己买了些材料  自己做的,焊接m0的板子是同学做毕业设计开的,仿真器是坛子里送的m058s上掰成两半搞的

M051_Init_Project.rar

765.86 KB

沙发
haolaishi| | 2014-3-21 08:14 | 只看该作者
启动文件中有个堆栈,应该是你的这个超过了

使用特权

评论回复
板凳
haolaishi| | 2014-3-21 08:16 | 只看该作者
Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

使用特权

评论回复
地板
niuyaliang| | 2014-3-21 08:20 | 只看该作者
是不是栈空间太小了

使用特权

评论回复
5
clyu| | 2014-3-21 15:22 | 只看该作者
应该考虑n1 > n时, 函数roll_left会导致什么后果?我觉得肯定是某个buffer溢出了

使用特权

评论回复
6
zxf0168| | 2014-3-21 18:49 | 只看该作者
溢出了吧,那个单片机都这样

使用特权

评论回复
7
缥缈九哥| | 2014-3-22 01:22 | 只看该作者
是不是堆栈开的不够?

使用特权

评论回复
8
xyz549040622| | 2014-3-22 07:53 | 只看该作者
缥缈九哥 发表于 2014-3-22 01:22
是不是堆栈开的不够?

九哥应该讲讲堆栈的故事

使用特权

评论回复
9
gcxzhz|  楼主 | 2014-3-22 16:20 | 只看该作者
本帖最后由 gcxzhz 于 2014-3-22 16:22 编辑
haolaishi 发表于 2014-3-21 08:14
启动文件中有个堆栈,应该是你的这个超过了

你好  我给我同学看了 他说是堆栈的问题  后来我将其改大还是无法运行   我把工程发上来了 麻烦看看   我用的芯片是m0516的


Stack_Size      EQU     0x00000200

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x0000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit


                PRESERVE8
                THUMB


上面是原始的面是我改了的  仍然不行啊
Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x0000040

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit


                PRESERVE8
                THUMB

使用特权

评论回复
10
gcxzhz|  楼主 | 2014-3-22 16:22 | 只看该作者
缥缈九哥 发表于 2014-3-22 01:22
是不是堆栈开的不够?

以前主要是搞硬件电路的  对这个不是太熟悉 ,请问一下是我10l 改的那样吗

使用特权

评论回复
11
gcxzhz|  楼主 | 2014-3-22 16:23 | 只看该作者
clyu 发表于 2014-3-21 15:22
应该考虑n1 > n时, 函数roll_left会导致什么后果?我觉得肯定是某个buffer溢出了 ...

我程序下进去硬件仿真打开程序都停不下来

使用特权

评论回复
12
gcxzhz|  楼主 | 2014-3-22 16:37 | 只看该作者
缥缈九哥 发表于 2014-3-22 01:22
是不是堆栈开的不够?

还有这个堆栈到底开多少合适

使用特权

评论回复
13
kctime| | 2014-3-22 17:30 | 只看该作者
gcxzhz 发表于 2014-3-22 16:37
还有这个堆栈到底开多少合适

把堆栈SP丢到RAM最后,,如果还不行那就没办法了

使用特权

评论回复
14
kctime| | 2014-3-22 17:31 | 只看该作者
gcxzhz 发表于 2014-3-22 16:37
还有这个堆栈到底开多少合适

楼主加个QQ呗,,我以前想做旋转LED。。结果无线供电没做出来。。能咨询咨询么

使用特权

评论回复
15
haolaishi| | 2014-3-23 22:04 | 只看该作者
贴出程序来,单纯算法的部分,给你运行看看

使用特权

评论回复
16
gcxzhz|  楼主 | 2014-3-24 14:22 | 只看该作者
haolaishi 发表于 2014-3-23 22:04
贴出程序来,单纯算法的部分,给你运行看看

附件里面有,下下来解压编译即可

使用特权

评论回复
17
kamen588| | 2014-3-24 19:25 | 只看该作者
我用pic16系列单片机 驱动128 *32 点阵  也遇到过类似问题  直接逐行输出128 *32 个点的数据 点阵就不显示 后来就把字模数组 分为 两个128*16点的数据 分两次输出就解决了

另外 请教一个问题 字模数组定义的是常量数组吧  怎么会占用堆栈的空间呢?

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
gcxzhz + 4 定义成const 函数中引用时强制转换为指针就.
18
kamen588| | 2014-3-24 20:23 | 只看该作者
别沉了 请回答18楼最后提出的问题

使用特权

评论回复
19
gcxzhz|  楼主 | 2014-3-24 22:42 | 只看该作者
kamen588 发表于 2014-3-24 19:25
我用pic16系列单片机 驱动128 *32 点阵  也遇到过类似问题  直接逐行输出128 *32 个点的数据 点阵就不显示  ...

我现在的问题是只要数组总的元素的个数大于某个值,不管是几个数组 roll_left(unsigned int ×p,unsigned int size); 一搞进去单片机就异常,即使将数组分成几个 分别运行也不行啊

常量应该是保存在rom中吧

使用特权

评论回复
20
gcxzhz|  楼主 | 2014-3-25 11:42 | 只看该作者
自己回答啊  经过自己网上搜寻 找到了个:在stm32中如何将数组存储在rom中。我想 m0是arm的内核  m3也是 那数据储存应该差不多吧,受那个帖子的启发,将数组定义为const,调用时强制转换为指针,经过测试没有问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:人欲取之 天必与之 所有回复仅个人观点

14

主题

647

帖子

1

粉丝