RIOT OS - 嵌入式平台的“stdout”

时间:2018-01-31 15:11:54

标签: c embedded

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

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

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

如果这对SO过于具体,请道歉。我不熟悉RIOT OS邮件列表,但我也会尝试。

编辑:hello-world示例非常简单,如下所示:

columns

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

4 个答案:

答案 0 :(得分:2)

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

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

另外,如果您希望malloc() 工作,则需要实现_sbrk_r()

Bill Gatliff's article on embedded.com提供了用于uC / OS的Newlib移植的示例 - RIOT OS的原理可能类似,但如果您的库I / O需求不需要那么复杂,那么同样可以使其更简单。 / p>

答案 1 :(得分:2)

在RIOT操作系统中,默认情况下,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/boards/nucleo-f411re/include/periph_conf.h#L56

答案 2 :(得分:1)

在嵌入式系统上,用户必须实现putchar(char chr)函数来输出单个char。例如,此功能可以使用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

答案 3 :(得分:0)

嵌入式微控制器系统编译器属于一个名为独立实现的类别。这意味着他们不必提供complete.cases()等库,您也不能指望stdio.h可用。

但是有可能存在通过UART传输实现stdio.h的编译器库。您必须检查编译器是否实现了这一点。

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