CH32V307 Bootloader 编译时提示FLASH 长度不够?

情况:

1.实际的BOOTLOADER 编译后的代码长度只有15K
2,设置20K FLASH

MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 20K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
}


3.  在程序中有两个长的USB用的 RAM DMA 缓冲区 每个16K长度

   在LD 文件中,无特别指出这个 DMADATA段在哪里?

_

_attribute__ ((aligned(16))) UINT8 LONG_Databuf1[ 16384 ]  __attribute__((section(".DMADATA"))); /* 端点2数据发送缓冲区 */
__attribute__ ((aligned(16))) UINT8 LONG_Databuf2[  16384 ]  __attribute__((section(".DMADATA"))); /* 端点2数据发送缓冲区 */


编译后,连接提示 DMADATA 段不适合FLASH 长度,  这个DMADATA 段是RAM的跟FLASH有什么关系?


4.  把 DMA段的属性去掉,改为如下,编译 及link都正常了,程序运行也正常

__attribute__ ((aligned(16))) UINT8 LONG_Databuf1[ 16384 ] ;/* 端点2数据发送缓冲区 */
__attribute__ ((aligned(16))) UINT8 LONG_Databuf2[  16384 ]; /* 端点2数据发送缓冲区 */


这样问题来了? __attribute__((section(".DMADATA")));有什么用呢? 会不会影响USB的接收发送

段属性加上时的错误如下图:


1638005366953104.jpg



取掉DMADATA属性,编译正常

1638005381123450.jpg


原因是没有属性时这个缓冲区属于bss数据,不需初始化, 加上这个属性后,这块DMADATA数据放在DATA段中了,所以在FLASH占用了同样大小的初始化数据。

该如何设这个属性才是正确的?



你好,Ld中并没有定义这个段,所有编译器编译连接的时候不会把这个数组按照bss段处理,而是类似于data,导致编译的时候flash变大,ram也变大,上电CPU从flash搬运到ram中执行。__attribute__((section(".DMADATA")))这个属性可以去掉,对你的功能不会有任何影响。


只有登录才能回复,可以选择微信账号登录