新唐单片机移植RT-Thread,Finsh组件的接口函数编写

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

移植RT-Thread到新唐的M0内核单片机上后,想调用finsh组件,参考别人的接口代码后,发现输出格式不是很理想。所以仔细整理了一下思路,自己修改了相关函数。下面分享一下这个代码的思路。我使用的单片机型号是M031KIAAE。

一、RTT的移植

RTT的移植网上教程很多,我是参考这篇文章的,链接:https://hxydj.blog.csdn.net/article/details/110956288。
同时,还参考了这篇文章,链接:https://www.eet-china.com/mp/a72636.html。这篇是主要是参考一下他写的接口函数。我之前直接照抄下来,输出的的样式不对,很难看。具体原因我猜测是我们使用的单片机型号不一样,调用的库函数实现原理可能不同。
我最开始是参考使用了新唐uart.h的那个UART_WRITE函数,出现的bug是一次性最多只能输出16个字符,所以我后来找了一下,使用了在uart.c里的UART_Write函数。这个函数是可以输出缓存里的字符的,这个缓存大小就可以自定义大小了,而之前的的函数受制于FIFO的缓存大小,最多只能一次性输出16个字符。

二、具体函数代码

1.rt_hw_console_output的编写

这个是使用finsh组件第一个要实现的函数,他是rt_kprintf函数实现的基础,具体实现如下。

代码如下:

void rt_hw_console_output( const char *str )
{
	  /*缓存大小128,和RTT写的函数一致*/
	  uint8_t rt_log_buf[RT_CONSOLEBUF_SIZE];
	  uint8_t i=0;
    /* 进入临界段 */
    rt_enter_critical();
    /* 直到字符串结束 */
    while ( *str != '\0' )
    { 
        if( *str == '\n')	
		 {
			rt_log_buf[i++] = *str++; 
			/*为什么:因为RTT自己写的字符串打印只写\n结尾,所以需要自己添加回车号:'\r'*/
			rt_log_buf[i++]='\r';
		 }
		else
		 {
			rt_log_buf[i++] = *str++; 
		 }							
    }		
    UART_Write( UART0,rt_log_buf ,i );
    while ( UART_IS_TX_EMPTY(UART0) == 1 );
    /* 退出临界段 */
    rt_exit_critical();
}

2.rt_hw_console_getchar的编写

这部分没什么问题,参考RTT的官方移植思路就可以。我是直接参考了我贴的链接的第二篇文章。因为bug不在这所以也没动。
代码如下(示例):

//使用Finsh组件三步骤:
//1.实现该函数及rt_hw_console_output函数;
//2.rtconfig.h中开启RT_USING_FINSH宏;
//3.添加Finsh组件(cmd.c、msh.c、shell.c);
#if(1)
char rt_hw_console_getchar(void)
{
    //查询方式实现,记得将Usart1初始化中的中断接收配置相关代码注释掉
    int ch = -1;
   if((UART0->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)
        {
          ch = (int) (UART0->DAT);
        }
	rt_thread_mdelay( 10 );
    return ch;
}
#endif

该处使用的url网络请求的数据。


调试成功的界面

这是我自己调试成功以后的界面。之前直接copy代码的时候,输出如下:
其实其实仔细分析一下就知道是需要在字符串后面确保添加一个’\r’,回到行首。

其他可能的问题

在这说一下我移植碰到的问题
1.进入硬件除错中断函数了。我的bug原因是堆内存大小没分配够。
2.没了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值