我似乎无法弄清楚为什么有些printf库函数会从libc_nano.a链接到我的代码中,即使我从不使用任何函数printf.它窃取了至少2K宝贵的闪存空间.我能看到的部分_printf_i,_vfprintf_r,_vfiprintf_r在我的链接器映射文件等.
我试过了
这些都不会使符号从地图文件中消失.
我的gcc选项:
CFLAGS = -Og -Wall -g3 -Wdouble-promotion -mcpu=cortex-m0 -mthumb -fmessage-length=0 -ffunction-sections -mfloat-abi=soft -DUSE_HAL_DRIVER
LFLAGS = -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -specs=nosys.specs -specs=nano.specs -Wl,--gc-sections
Run Code Online (Sandbox Code Playgroud)
arm-none-eabi-gcc.exe(适用于ARM嵌入式处理器的GNU工具)5.2.1 20151202(re lease)[ARM/embedded-5-branch revision 231848] Copyright(C)2015 Free Software Foundation,Inc.这是免费的软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.
首先,他们为什么要联系起来?有没有办法排除它们?
在修改了一些项目设置(即更改 FPU 类型)后,包含中出现了一些奇怪的条目,例如:
项目/#undef __ARM_NEON
这些不会显示在任何可以指定包含的常用位置(C/C++ 构建 -> 设置 -> 工具设置 -> 编译器 xy -> 包含)。
这个明显无效的包含路径会在“问题”选项卡上创建一条恼人的警告消息。
有时,对 FPU 设置进行更多修改会使这些条目消失,或导致出现更多类似的条目,但我在这里看不到任何逻辑行为。这是一个错误吗?
我正在使用最新的CCS和MSP-GCC编译器.以下代码
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{...isr}
Run Code Online (Sandbox Code Playgroud)
这是TI宣布ISR-s的最新官方支持的方法不起作用,我得到以下编译器消息:
warning: ignoring #pragma vector [-Wunknown-pragmas]
#pragma vector=USCI_A1_VECTOR
^
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
__interrupt void USCI_A1_ISR(void)
Run Code Online (Sandbox Code Playgroud)
我也尝试过不同的方法,比如:
interrupt(USCI_A1_VECTOR) USCI_A1_ISR(void) { //code goes here}
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
c:/ti/ccsv6/ccs_base/msp430/include_gcc/msp430f5529.h:5328:33: error: expected declaration specifiers or '...' before '(' token
#define USCI_A1_VECTOR (47) /* 0xFFDC USCI A1 Receive/Transmit */
^
../uart_printf.c:40:11: note: in expansion of macro 'USCI_A1_VECTOR'
interrupt(USCI_A1_VECTOR) USCI_A1_ISR(void)
^
Run Code Online (Sandbox Code Playgroud)
这似乎工作:
__attribute__((interrupt(USCI_A1_VECTOR)))
void USCI_A1_ISR(void){ //code goes here }
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?