0

我是第一次尝试 RIOT OS。下载源代码后,我可以非常轻松地构建应用程序,包括需要 ARM 工具链的目标。

hello-world 应用程序在我的 Linux 构建机器(使用 BOARD=native 构建)上运行良好,并在终端中打印。

当我切换到嵌入式平台(Nucleo F411,例如 ARM Cortex M4)时,我可以期望在哪里出现任何 puts() 或 printf() 调用?此外,如果它不是已经要去的地方,我该如何设置 printf() 去 UART1?

抱歉,如果这对 SO 来说太具体了。我不熟悉 RIOT OS 邮件列表,但我也会在那里尝试。

编辑: hello-world 示例真的很简单,如下所示:

#include <stdio.h>

int main(void)
{
    puts("Hello World!");

    printf("You are running RIOT on a(n) %s board.\n", RIOT_BOARD);
    printf("This board features a(n) %s MCU.\n", RIOT_MCU);

    return 0;
}

在遵循此处的安装说明后,我正在使用 ARM GNU 工具链 gcc-arm-none-eabi-7-2017-q4 进行编译:链接。我想我需要一些额外的编译器标志,或者在上面的应用程序代码之外编辑板初始化函数。但是,在这个阶段,我不知道从哪里开始。我的最终目标是观察“Hello World!” 在我的开发套件的引脚 TX/D1 上配置它去那里后,“你正在运行......”。

4

4 回答 4

5

在 RIOT OS 中,默认情况下 stdio 映射到 UART0。这可以在这里看到: https ://github.com/RIOT-OS/RIOT/blob/master/sys/include/stdio_uart.h#L38

通过重新定义STDIO_UART_DEV,您可以将 stdio 映射到不同的 UART。如果您想知道哪个 UART 映射到哪个引脚,请查看periph_conf.h您的电路板,如果是 Nucleo F411,请查看: https ://github.com/RIOT-OS/RIOT/blob/master/板/nucleo-f411re/include/periph_conf.h#L56

于 2018-09-30T17:32:22.357 回答
2

您正在使用的工具链使用 Newlib C 库(而不是具有 POSIX 依赖项的 GNU 的 libc)。要将 newlib 移植到您的目标,一些标准函数需要至少重新实现一些系统调用存根。

具体为了stdout工作,您至少需要实施_write_r(). 如果 UART 是您将支持的唯一设备,您可以忽略文件描述符 - 对于 stdout,它将始终为 1(0 = stdin,2 = stderr)。

顺便说一句,如果你想让malloc() et al工作,你需要实现_sbrk_r().

Bill Gatliff 在 embedded.com 上的文章提供了用于 uC/OS 的 Newlib 移植的示例——原则可能与 RIOT OS 相似,但同样,如果您的库 I/O 不需要那么复杂,您可以使其更简单。

于 2018-01-31T23:30:01.553 回答
1

在嵌入式系统上,用户必须实现函数 putchar(char chr) 才能输出单个字符。例如,此功能可以使用 UART。

该函数应类似于:

int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the USART */
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100);

    return ch;
}

在这里您可以找到一个更复杂的 STM32F0 示例

https://github.com/bjornfor/stm32-test/blob/master/STM32F0xx_StdPeriph_Lib_V1.0.0/Project/STM32F0xx_StdPeriph_Examples/USART/Printf/main.c

于 2018-01-31T16:53:38.820 回答
0

嵌入式微控制器系统编译器属于称为独立实现的类别。这意味着他们不必提供类似的库,stdio.h并且您不能期望printf可用。

然而,有可能存在通过 UART 传输实现 stdio.h 的编译器库。您将不得不检查您的编译器是否实现了这一点。

仅对于简单的测试和类似“hello world”的应用程序,使用 GPIO 引脚要容易得多。相当于“hello world”的嵌入式系统是让 LED 闪烁。

于 2018-01-31T15:56:15.537 回答