c - STM32 CubeMX/GNU/Eclipse-工具链重定向(newlib 和 libgloss)

标签 c stm32 newlib gnu-arm

我使用 Eclipse CDT 4.5.1 (Mars)、ARM GCC 4.9 2015q3、Liviu Ionescu 的 GnuArmEclipse-Plugin、OpenOCD 0.9.0 和 STM32CubeMX 4.11.0 为 STM32F401C 探索板设置了基于 Windows 的工具链。

基本上,我使用 STM32CubeMX 生成了一个 SW4STM32 项目,将所有内容导入到一个新的 Cross ARM GCC Eclipse C 项目中,并调整了一些参数,即符号、CPU 类型、FPU 和链接文件。成功构建了一个简单的 LED 闪烁示例,可以通过 OpenOCD 执行,断点也可以正常工作。

为了提供 newlib 或 newlib nano 所需的系统调用,例如 _sbrk_write,我从 --specs=nosys.specs 开始 链接器选项。这样动态内存分配工作得很好。但是,我想自己实现 _write 函数,以便打印到显示器或通过 UART 发送数据。

在 libgloss 中,_write 函数有一个弱符号,因此重新实现它应该就足够了。我在我的 main.c 中做了这个:

int _write (int fd, char *ptr, int len)
{
  HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
  HAL_Delay(300);
  return len;
}

int main(void)
{
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
  printf("Blink");

  while(1)
  {
    // do nothing
  }
}

我原以为 LED 会闪烁,但只有主函数中的切换命令显示了效果。

为什么我的写函数没有被调用?我错过了什么吗?

最佳答案

您必须将缓冲区显式刷新到输出 (fflush(stdout)) 或发送换行符 ('\n')。

关于c - STM32 CubeMX/GNU/Eclipse-工具链重定向(newlib 和 libgloss),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34060586/

相关文章:

我们可以区分变量和指针变量吗

c - 使用 Xlib 获取鼠标点击坐标

code-generation - STM32 CubeMX 自定义代码生成

c - 未定义对 "only some math.h"函数的引用

c - 如何移植 newlib?

在 C 中将项目强制转换到链表末尾

c++ - 如何以编程方式将照片转换为类似宝丽来的照片?

c - 是否可以访问LR、PC等CPU寄存器

usb - STM32f107 usb重新枚举

gcc - GNU 工具链 (newlib) : compatibility between toolchain versions (undefined symbol __ctype_ptr__)