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

【请教】对数组赋值导致代码运行异常

[复制链接]
Leeru 提问时间:2017-12-20 09:19 /
本帖最后由 Inc_brza 于 2017-12-20 09:30 编辑

請教一下!
我使用STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\SysTick範例程式
並在主程式MAIN下宣告了
  1. uint32_t Input_f32[2048];
  2. uint32_t Output_f32 [1024];
  3. for (i =0 ; i<2048 ; i++)
  4. {
  5.     Input_f32=0;
  6. }
复制代码

原本
   
  1. /* Toggle LED3 and LED6 */
  2.     STM_EVAL_LEDToggle(LED3);
  3.     STM_EVAL_LEDToggle(LED6);

  4.     /* Insert 50 ms delay */
  5.     Delay(50);

  6.     /* Toggle LED4 and LED5 */
  7.     STM_EVAL_LEDToggle(LED4);
  8.     STM_EVAL_LEDToggle(LED5);

  9.     /* Insert 100 ms delay */
  10.     Delay(100);
复制代码


會閃爍的LED3,4,5,6變得完全不閃爍了呢?
這是什麼原因造成的呢?

收藏 评论12 发布时间:2017-12-20 09:19

举报

12个回答
Inc_brza 回答时间:2017-12-20 09:27:27
本帖最后由 Inc_brza 于 2017-12-20 09:32 编辑

发帖子前请先想清楚自己的问题他是啥,想好标题再发帖
代码最好以截图提供,说明你操作了啥导致啥问题!编码格式注意一下,
别给大家造成眼球污染!帮楼主编辑了一下帖子,楼主请把数组操作屏蔽掉看看是否问题解决!
如果真是数组操作导致的问题,请看一下数组的大小以及数组在哪里定义的。
注意一下栈大小(startup文件可以设置)是否过小!
最好已截图的方式贴出你的操作代码。
Leeru 回答时间:2017-12-20 09:55:06
版主謝謝您了~
不好意思!我來自台灣~
我看不懂您寫的意思
因為說法不同
不過如果我把
宣告變數拿掉後
執行就是正常的了
請問我要注意startup_stm32f4xx.s的哪個部份呢
謝謝版主這麼熱心的回答
Inc_brza 回答时间:2017-12-20 09:58:50
本帖最后由 Inc_brza 于 2017-12-20 10:00 编辑
Leeru 发表于 2017-12-20 09:55
版主謝謝您了~
不好意思!我來自台灣~
我看不懂您寫的意思

额,我也不知道你们对名词的说法,不过大概就是这么个意思,
建议你先把main函数截图放上来另外,我先猜测你的数组是在main函数里声明定义的,你把他拿出来
作为全局变量看看是否还有异常,如果异常解决,那问题点就知道是什么了
Leeru 回答时间:2017-12-20 10:10:43
本帖最后由 Leeru 于 2017-12-20 10:32 编辑

版主謝謝您了~
底下是程式碼!
  1. int main(void)
  2. {
  3.   /*!< At this stage the microcontroller clock setting is already configured,
  4.        this is done through SystemInit() function which is called from startup
  5.        file (startup_stm32f4xx.s) before to branch to application main.
  6.        To reconfigure the default setting of SystemInit() function, refer to
  7.         system_stm32f4xx.c file
  8.      */   
  9.              uint16_t i;
  10.         //uint32_t Input_f32[2048];
  11.         //uint32_t Output_f32 [1024];      

  12.         for (i =0 ; i<2048 ; i++)
  13.         {
  14.                     Input_f32[i]=0;
  15.         }
  16. /*
  17.         for (i =0 ; i<1024 ; i++)
  18.         {
  19.                     Output_f32[i]=0;
  20.         }
  21. */
  22.   /* Initialize Leds mounted on STM32F4-Discovery board */
  23.   STM_EVAL_LEDInit(LED4);
  24.   STM_EVAL_LEDInit(LED3);
  25.   STM_EVAL_LEDInit(LED5);
  26.   STM_EVAL_LEDInit(LED6);

  27.   /* Turn on LED4 and LED5 */
  28.   STM_EVAL_LEDOn(LED4);
  29.   STM_EVAL_LEDOn(LED5);
  30.   
  31.   /* Setup SysTick Timer for 1 msec interrupts.
  32.      ------------------------------------------
  33.     1. The SysTick_Config() function is a CMSIS function which configure:
  34.        - The SysTick Reload register with value passed as function parameter.
  35.        - Configure the SysTick IRQ priority to the lowest value (0x0F).
  36.        - Reset the SysTick Counter register.
  37.        - Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
  38.        - Enable the SysTick Interrupt.
  39.        - Start the SysTick Counter.
  40.    
  41.     2. You can change the SysTick Clock source to be HCLK_Div8 by calling the
  42.        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
  43.        SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
  44.        inside the misc.c file.

  45.     3. You can change the SysTick IRQ priority by calling the
  46.        NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function
  47.        call. The NVIC_SetPriority() is defined inside the core_cm4.h file.

  48.     4. To adjust the SysTick time base, use the following formula:
  49.                            
  50.          Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s)
  51.    
  52.        - Reload Value is the parameter to be passed for SysTick_Config() function
  53.        - Reload Value should not exceed 0xFFFFFF
  54.    */
  55.   if (SysTick_Config(SystemCoreClock / 1000))
  56.   {
  57.     /* Capture error */
  58.     while (1);
  59.   }

  60.   while (1)
  61.   {
  62.     /* Toggle LED3 and LED6 */
  63.     STM_EVAL_LEDToggle(LED3);
  64.     STM_EVAL_LEDToggle(LED6);

  65.     /* Insert 50 ms delay */
  66.     Delay(50);

  67.     /* Toggle LED4 and LED5 */
  68.     STM_EVAL_LEDToggle(LED4);
  69.     STM_EVAL_LEDToggle(LED5);

  70.     /* Insert 100 ms delay */
  71.     Delay(100);
  72.   }
  73. }
复制代码

主要只添加了

             uint16_t i;
        uint32_t Input_f32[2048];
        uint32_t Output_f32 [1024];      

        for (i =0 ; i<2048 ; i++)
        {
                    Input_f32=0;
        }

就會導致while迴圈下LED3,4,5,6都沒動作

謝謝您了版主~

Inc_brza 回答时间:2017-12-20 10:15:43
Leeru 发表于 2017-12-20 10:10
版主謝謝您了~
底下是程式碼!
int main(void)

都说了,程序应该截图,或者使用编辑框上方的代码:<>这个属性输入你的代码,能让
看帖者舒服,你这样乱七八糟的贴代码,谁愿意看?就更别说帮你解决问题了!请自行修改
一下你的帖子内容。
你的变量定义在函数内,属于栈溢出,把你的数组定义放在函数外部即可解决,例如:
  1. uint32_t Input_f32[2048];
  2. uint32_t Output_f32 [1024];   

  3. void main(void)
  4. {
  5.     int i = 0;
  6.     for (i = 0; i < 2048; i ++) {
  7.         Input_f32[i] = 0;
  8.     }
  9.     ...
  10. }
复制代码
Leeru 回答时间:2017-12-20 10:21:52
版主您好~
我這邊有試著把變數當作全域變數並且執行後是正常的
可是當我嘗試把變數宣告成float全域變數後
LED又變成沒動作了
因為這兩個變數我要用做FFT運算使用
所以會宣告這兩個變數為float
請問有什麼方法
可解決的嗎?
Leeru 回答时间:2017-12-20 10:24:01
版主不好意思~
我還不會編輯您提到的代碼編輯
抱歉了~
謝謝您耐心的看完
Inc_brza 回答时间:2017-12-20 10:32:51
请注意:
TIM截图20171220103134.jpg
箭头处鼠标左键,会弹出一个对话框,在对话框里输入你的代码!
如果你连这个都不懂什么意思,只能说你连发帖的能力都没有!
Leeru 回答时间:2017-12-20 10:35:19
Inc_brza 发表于 2017-12-20 10:32
请注意:

箭头处鼠标左键,会弹出一个对话框,在对话框里输入你的代码!

謝謝您版主~我會使用了
下次不會再犯錯了
Inc_brza 回答时间:2017-12-20 10:41:15
Leeru 发表于 2017-12-20 10:21
版主您好~
我這邊有試著把變數當作全域變數並且執行後是正常的
可是當我嘗試把變數宣告成float全域變數後

详细我不知道,全部定义成float内存消耗会很严重,自行理解"heap/stack"的概念,
FFT也不需要一个2KByte的float类型的数组吧?请自行参考其他的FFT的代码吧!
MrJiu 回答时间:2017-12-20 14:46:48
Leeru 发表于 2017-12-20 10:21
版主您好~
我這邊有試著把變數當作全域變數並且執行後是正常的
可是當我嘗試把變數宣告成float全域變數後

首先可以去了解一下什么是堆,栈,全局变量,局域变量这几个关系。。。
至于你这个问题,一般编译器设置的栈的容量在多少来着,搞忘记啦,而且是可以更改。。。栈就是用来保存局域变量的,当然了也包括压栈和出栈。。。你这
uint32_t Input_f32[2048];
uint32_t Output_f32 [1024];
两个局域变量太大啦,很显然栈溢出,如果在线调试的话,会看到直接进入HardFault_Handler中断,然后死循环。。。
maxtch 回答时间:2017-12-20 20:09:36
光这两个数组申明就吃掉了 12kB 的内存……你用的什么芯片,内存还够吗?有没有出现堆栈溢出?

所属标签

相似问题

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