LPCXpress编译器内存分配bug? (有图有真相!)

[复制链接]
3971|3
 楼主| sinanjj 发表于 2010-9-19 09:17 | 显示全部楼层 |阅读模式
本帖最后由 sinanjj 于 2010-9-19 09:25 编辑

用lpcxpress编译程序如下.
  1. #include "LPC11xx.h"
  2. int main(void)
  3. {
  4.         SystemInit();
  5.         unsigned char aaa[1000];
  6.         unsigned long p;
  7. #define BAUDRATE 115200

  8.         NVIC_DisableIRQ(UART_IRQn);
  9.         LPC_IOCON->IO1_6 = 0xc1;        // UART RXD
  10.         LPC_IOCON->IO1_7 = 0xc1;        // UART TXD
  11.         LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);        // Enable UART clock
  12.         LPC_SYSCON->UARTCLKDIV = 0x1;                // divided by 1
  13.         LPC_UART->LCR = 0x83;        // 8 bits, no Parity, 1 Stop bit
  14.         uint32_t Fdiv;
  15.         Fdiv = (((SystemCoreClock/LPC_SYSCON->SYSAHBCLKDIV)/LPC_SYSCON->UARTCLKDIV)/16)/BAUDRATE;
  16.         LPC_UART->DLM = Fdiv/256;
  17.         LPC_UART->DLL = Fdiv%256;
  18.         LPC_UART->LCR = 0x03;                // DLAB = 0
  19.         LPC_UART->FCR = 0x07;                // Enable and reset TX and RX FIFO.
  20.         Fdiv = LPC_UART->LSR;                // Read to clear the line status.

  21.         p=&p;
  22.         LPC_UART->THR = p;LPC_UART->THR = p>>8;LPC_UART->THR = p>>16;LPC_UART->THR = p>>24;
  23.         unsigned char i;
  24.         p=&i;
  25.         LPC_UART->THR = p;LPC_UART->THR = p>>8;LPC_UART->THR = p>>16;LPC_UART->THR = p>>24;
  26.         unsigned char i1;
  27.         p=&i1;
  28.         LPC_UART->THR = p;LPC_UART->THR = p>>8;LPC_UART->THR = p>>16;LPC_UART->THR = p>>24;
  29.         unsigned char i2;
  30.         p=&i2;
  31.         LPC_UART->THR = p;LPC_UART->THR = p>>8;LPC_UART->THR = p>>16;LPC_UART->THR = p>>24;
  32.         LPC_UART->THR = i;LPC_UART->THR = i1;LPC_UART->THR = i2;

  33.         LPC_IOCON->IO2_6 = 0x000000c0;        // Hi-Z
  34.         LPC_GPIO3->DIR = 0x00000030;        // GPIO3_4, GPIO3_5 output. now 1
  35.         LPC_GPIO3->MASKED_ACCESS[0x030] = 0x00000000;        // GPIO3_5, GPIO3_4 output 0
  36.         for (;;) {
  37.                 if (LPC_GPIO2->MASKED_ACCESS[0x040] == 0x00000000) LPC_GPIO3->MASKED_ACCESS[0x010] = 0xffffffff;        // GPIO3_4 output 1
  38.                 else LPC_GPIO3->MASKED_ACCESS[0x010] = 0x00000000;        // GPIO3_4 output 0
  39.         }
  40. }
重点在这里:

  •      p=&p;
  •         LPC_UART->THR = p;LPC_UART->THR = p>>8;LPC_UART->THR = p>>16;LPC_UART->THR = p>>24;
  •         unsigned char i;
  •         p=&i;
  •         LPC_UART->THR = p;LPC_UART->THR = p>>8;LPC_UART->THR = p>>16;LPC_UART->THR = p>>24;
  •         unsigned char i1;
  •         p=&i1;
  •         LPC_UART->THR = p;LPC_UART->THR = p>>8;LPC_UART->THR = p>>16;LPC_UART->THR = p>>24;
  •         unsigned char i2;
  •         p=&i2;
  •         LPC_UART->THR = p;LPC_UART->THR = p>>8;LPC_UART->THR = p>>16;LPC_UART->THR = p>>24;
  •         LPC_UART->THR = i;LPC_UART->THR = i1;LPC_UART->THR = i2;

检测变量的地址. 通过串口打印




运行, 跑到 LPC_UART->THR = i;LPC_UART->THR = i1;LPC_UART->THR = i2;这里必死.




串口结果! 如图:


lpc1111的ram地址是0x1000 0000开始, 到0x1000 0800结束!

关键的问题是: 变量的地址变化: D0-D7-D6-D5 后边分配变量跑死.....

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| sinanjj 发表于 2010-9-19 09:30 | 显示全部楼层
本帖最后由 sinanjj 于 2010-9-19 09:41 编辑

用keil编译直接提示:
: error:  #268: declaration may not appear after executable statement in block


IAR也是要求变量放在开头的.....

难道MCU的C都是要求这么诡异的????

查到

Prior to the 1999version of the C language standard, declarations are not allowed afterexecutable statements in a block.  But since 1999 they are, so thecode is quite legal if you are compiling with the current C standard.


难道MCU的编译器还是C89标准..............
 楼主| sinanjj 发表于 2010-9-20 09:02 | 显示全部楼层
顶下

我又查看了下

是串口指令链接过紧密, 导致串口实效所致
xuyiyi 发表于 2010-9-24 05:46 | 显示全部楼层
呵呵,帮顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:In God We Trust 独立的个人,体赖科学技术工具提供针对个人的产品与服务,是通向幸福的唯一道路 工程师,设计师等可以个人创业的群体,将逐步瓦解官僚体制公司,成为中国中产。(重复劳动,工厂等,将逐步机械化) seacer.co

456

主题

6299

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部