在STM32上实现 printf, scanf,兼谈 semihosting 半主机机制

2019-12-19 18:13发布

半主机是这么一种机制,它使得在ARM目标上跑的代码,如果主机电脑运行了调试器,那么该代码可以使用该主机电脑的输入输出设备。
  这点非常重要,因为开发初期,可能开发者根本不知道该 ARM 器件上有什么输入输出设备,而半主基机制使得你不用知道ARM器件的外设,利用主机电脑的外设就可以实现输入输出调试。
  所以要利用目标 ARM器件的输入输出设备,首先要关掉半主机机制。然后再将输入输出重定向到 ARM 器件上,如 printf 和 scanf,你需要重写 fputc和 fgetc 函数。下面就是将 scanf 和 printf 重定向到 uart 的代码。

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  ch: the char to be send.
  * @param  *f:
  * @retval the char that send out.
  */
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the USART */
   
    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {
    }
    USART_SendData(USART1, (uint8_t) ch);

    return ch;
}

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  *f
  * @retval the char that received.
  */
int fgetc(FILE *f)
{
    int ch;
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {
    }
    ch = USART_ReceiveData(USART1);
   
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {
    }
    USART_SendData(USART1, (uint8_t) ch);
    return ch;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
lileistone
1楼-- · 2019-12-19 19:27
回复【楼主位】armrunc1  
论坛首页 -> 虚拟总论坛 -> semihosting 半主机机制 实现 printf, scanf (属于论坛:STM32/8)
-----------------------------------------------------------------------

楼主标题党。。。

明明标题说是semihosting实现printf。。。。结果内容是如何“不使用”semihosting实现……
armrunc1
2楼-- · 2019-12-20 00:02
回复【1楼】lileistone 三块石头
回复【楼主位】armrunc1   
论坛首页 -> 虚拟总论坛 -> semihosting 半主机机制 实现 printf, scanf (属于论坛:stm32/8)  
-----------------------------------------------------------------------
楼主标题党。。。
  
明明标题说是semihosting实现printf。。。。结果内容是如何“不使用”semihosting实现……
-----------------------------------------------------------------------

谢谢提醒,标题是容易产生歧义,修改了一下。 semihosting 编译器已经帮你实现了,所以直接仿真就行,本文的目的是产生一个能在目标 ARM 上运行的 printf 和 scanf.
armrunc1
3楼-- · 2019-12-20 02:21
上传整个 C 文件。
点击此处下载 ourdev_717304ZQS49H.rar(文件大小:982字节) (原文件名:ARC_Retarget.rar)
armrunc1
4楼-- · 2019-12-20 07:43
 精彩回答 2  元偷偷看……
lileistone
5楼-- · 2019-12-20 09:31
回复【2楼】armrunc1

谢谢提醒,标题是容易产生歧义,修改了一下。 semihosting 编译器已经帮你实现了,所以直接仿真就行
-----------------------------------------------------------------------

实际上呢,我试过。同样的硬件(EK-STM32F,万利199那个),IAR6.30就可以使用半主机,可以在调试窗口中看到打印上来的hello world;但是KEIL RVMDK 4.0就不行,貌似是屏蔽了这个功能,会停在BKPT 0x1234那条指令上。
armrunc1
6楼-- · 2019-12-20 12:40
回复【5楼】lileistone 三块石头
-----------------------------------------------------------------------

我的没有问题啊,使用的 MDK 4.23.

一周热门 更多>