Re: ATSAME54P20A--定址

作者 Libra 於 2020年05月22日 11:46:32
你好, 這個部分有兩個問題
1. 原先的寫法
uint8_t Can0MessageRAM[CAN0_MESSAGE_RAM_CONFIG_SIZE] __attribute__((aligned(32), address(0x20000000)));
uint8_t Can1MessageRAM[CAN1_MESSAGE_RAM_CONFIG_SIZE] __attribute__((aligned(32), address(0x20000000 + CAN0_MESSAGE_RAM_CONFIG_SIZE)));

CAN0_MESSAGE_RAM_CONFIG_SIZE = 56
Can1MessageRAM 的 address 因為aligned(32)的關係, 會等於address(0x20000000 + 32), 導致 Can1MessageRAM 記憶體位址去疊到Can0MessageRAM
Can0MessageRAM @ 0x20000000, size 56 (0x20000000 ~ 0x20000038)
Can1MessageRAM @ 0x20000020, size 56
所以請拿掉aligned(32)或是將Can1MessageRAM的定址取為32的倍數
最後
uint8_t Can0MessageRAM[CAN0_MESSAGE_RAM_CONFIG_SIZE] __attribute__((aligned(32), address(0x20000020)));
uint8_t Can1MessageRAM[CAN1_MESSAGE_RAM_CONFIG_SIZE] __attribute__((aligned(32), address(0x20000020 + ((CAN0_MESSAGE_RAM_CONFIG_SIZE%32)+1)*32)));

2. 另外一個問題是上面你看到, 起始位置不是在0x20000000而是自0x20000020開始, 你看MAP file時會發現前面0x20000000開始有保留一小塊區塊, 這部分需要避開
.bss 0x20000000 0x10 16 Uninitialized data
這部分會因為你用到的Harmony Module而不同, 看起來是因為SYS_Tick Module拿去用了, 我建的專案佔了0x0C, 你的佔了0x10, 因為aligned(32)所以我將起始位置移到0x20000020

來自: http://www.microchip.com.tw/newbb/viewtopic.php?forum=11&topic_id=22894&post_id=80676