我第一次尝试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引脚上的“你正在运行......”。
答案 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
的更复杂示例答案 3 :(得分:0)
嵌入式微控制器系统编译器属于一个名为独立实现的类别。这意味着他们不必提供complete.cases()
等库,您也不能指望stdio.h
可用。
但是有可能存在通过UART传输实现stdio.h的编译器库。您必须检查编译器是否实现了这一点。
仅仅为了简单的测试和类似“hello world”的应用程序,使用GPIO引脚要容易得多。相当于“hello world”的嵌入式系统是闪烁LED。