C语言 在WIndows上使用ld链接.o文件时出错



编译的两个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;但真正的问题是使用了错误的工具链。正确的gccgcc-arm-embedded -m cortex-m7。注意,您需要对ld命令进行相同的调整;我没有很好的来源,但是通常遵循这种模式,所以ld命令很可能是ld-arm-embedded

正确的gcc的来源:https://github.com/libopencm3/libopencm3/issues/965

相关内容

  • 没有找到相关文章

最新更新