STM32 CubeMX / GNU / Eclipse-Toolchain Retargeting (newlib и libgloss)

Я установил цепочку инструментов на основе Windows для платы обнаружения STM32F401C, используя Eclipse CDT 4.5.1 (Mars), ARM GCC 4.9 2015q3, GnuArmEclipse-Plugin от Ливиу Ионеску, OpenOCD 0.9.0 и STM32CubeMX 4.11.0.

Итак, в основном я создал проект SW4STM32 с помощью STM32CubeMX, импортировал все в новый проект Cross ARM GCC Eclipse C и адаптировал некоторые параметры, то есть символы, тип процессора, FPU и файл ссылки. Простой пример мигания светодиода построен успешно и может быть выполнен 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
  }
}

Я ожидал, что светодиод будет мигать, но только команда переключения внутри самой основной функции показала эффект.

Почему моя функция записи не вызывается? Я что-то пропустил?


person Dino    schedule 03.12.2015    source источник


Ответы (1)


Вы должны либо явно очистить буфер до вывода (fflush(stdout)), либо отправить перевод строки ('\n').

person veeman    schedule 06.12.2015
comment
Это была недостающая часть! Спасибо. - person Dino; 07.12.2015