编译的两个C文件如下所示:
gcc -g -c -Wall -I../include blink.c -o blink.o
gcc -g -c -Wall -I../include led/led.c -o led/led.o
这些操作看起来是成功的(生成了正确的文件)。
当试图用命令链接两个.o文件时:
ld -Map blink.map -T make.ld -N -o blink.exe blink.o led/led.o
返回这个错误:
undefined reference to `__main'
根据另一篇文章的建议,我尝试添加-r
,但这反而导致如下所示的错误:
C:mingwbinld.exe: address 0x0 of blink.exe section `data' is not within region `ram'
C:mingwbinld.exe: address 0x0 of blink.exe section `bss' is not within region `ram'
C:mingwbinld.exe: address 0xd0 of blink.exe section `text' is not within region `ram'
C:mingwbinld.exe: address 0x28 of blink.exe section `.xdata' is not within region `ram'
C:mingwbinld.exe: address 0x30 of blink.exe section `.pdata' is not within region `ram'
C:mingwbinld.exe: address 0x40 of blink.exe section `.rdata$zzz' is not within region `ram'
我使用的是Windows 10,并尝试使用Cygwin64终端和MinGW,但两者得到完全相同的结果。
我很确定这不是RAM问题,因为在make.ld
文件中分配了'320K'(我认为对于这样一个简单的程序应该足够了),如下所示:
ENTRY (main)
MEMORY
{
ram : ORIGIN = 0x20000000, LENGTH = 320K /* 0x2000 0000 - 0x2004 FFFF */
rom : ORIGIN = 0x08000000, LENGTH = 1024K /* 0x0800 0000 - 0x080F FFFF */
}
SECTIONS
{
data :
{
_DataStart = . ;
*(.data)
_DataEnd = . ;
} >ram
bss :
{
_BssStart = . ;
*(.bss)
_BssEnd = . ;
} >ram
text :
{
*(.text)
} >ram
}
作为参考,这里是另外三个文件:
blink.c
int main(void)
{
ledInit();
while (1)
{
ledToggle();
delay_ms(500);
}
return 0;
}
领导/led.c
#include "../stm32f7/onChipPeripherals.h"
void ledInit(void)
{
(*((uint32_t volatile *)(GPIO_A + GPIO_BSRR_OFFSET))) = 0xFFFF0000;
(*((uint32_t volatile *)(GPIO_A + GPIO_MODER_OFFSET))) = 0x00000010;
}
void ledToggle(void)
{
if ((*((uint32_t volatile *)(GPIO_A + GPIO_BSRR_OFFSET))) & 0x0000FFFF)
(*((uint32_t volatile *)(GPIO_A + GPIO_BSRR_OFFSET))) = 0xFFFF0000;
else
(*((uint32_t volatile *)(GPIO_A + GPIO_BSRR_OFFSET))) = 0x0000FFFF;
}
void delay_ms(int milliseconds)
{
long volatile cycles = (milliseconds * CYCLES_PER_MS);
while (cycles != 0)
cycles--;
}
stm32f7/onChipPeripherals.h
#include <stdint.h>
/* GPIO Registers */
#define GPIO_A (*((uint32_t volatile *)0x40020000))
#define GPIO_MODER_OFFSET (0x00) // GPIO port mode register
#define GPIO_OTYPER_OFFSET (0x04) // GPIO port output type register
#define GPIO_OSPEEDR_OFFSET (0x08) // GPIO port output speed register
#define GPIO_PUPDR_OFFSET (0x0C) // GPIO port pull-up/pull-down register
#define GPIO_IDR_OFFSET (0x10) // GPIO port input data register
#define GPIO_ODR_OFFSET (0x14) // GPIO port output data register
#define GPIO_BSRR_OFFSET (0x18) // GPIO port bit set/reset register
#define GPIO_LCKR_OFFSET (0x1C) // GPIO port configuration lock register
#define GPIO_AFRL_OFFSET (0x20) // GPIO alternate function low register
#define GPIO_AFRH_OFFSET (0x24) // GPIO alternate function high register
我将非常感谢任何关于下一步该做什么或尝试的建议或指导,因为我在这里有点卡住和不确定。
为目标架构使用正确的工具链。cygwin64上不合格的gcc
将尝试在cygwin
下构建程序以在x64 Windows上运行。
这个错误是抱怨sectionram
;但真正的问题是使用了错误的工具链。正确的gcc
为gcc-arm-embedded -m cortex-m7
。注意,您需要对ld
命令进行相同的调整;我没有很好的来源,但是通常遵循这种模式,所以ld
命令很可能是ld-arm-embedded
。
正确的gcc
的来源:https://github.com/libopencm3/libopencm3/issues/965