RT-Thread使用注意事项(一)

1.硬件的初始化
硬件的初始化和RTT系统初始化已经在main函数之前完成,即在component.c文件中的rtthread_startup()函数中完成了。 所以在main函数中,只需要创建线程和启动线程即可。

2.不同源文件相同变量的引用
被外部文件引用的变量要放在头文件中声明,例如main.c要引用board.h中的变量temp,分两步:
①在board.h中用extern修饰并定义;

extern int temp = 0;     //这里extern表示temp会在其他源文件中引用。

②在main.c中包含相应头文件:

 #include "board.h"    

之后则可以在main.c中直接使用。不过最好不要在头文件中定义全局变量,否则会造成变量被多次定义,出现赋值错误。
之所以要这样使用,是因为编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。这样,在编译main.c时会报temp undefined(未定义错误)。
同时,若在main.c重复定义temp,在编译器链接目标文件时,又会报重定义(multi defined)的错误,所以在main.c文件中只能声明temp变量。

3.标准输入输出函数的重映射
RT-Thread的标准输出函数为rt_kprintf(str),其重映射,就是将该标准函数内调用的传输函数rt_hw_console_output(const char *str),根据具体硬件重新定义。例如,在rt_hw_console_output()函数中,调用stm32标准库的串口发送函数,这样就将rt_kprintf()函数映射到串口。用户程序中调用rt_kprintf(),本质上是调用串口发送函数。
rt_hw_console_output(const char *str)函数自定义如下:

void rt_hw_console_output(const char *str)
{	
	/* 进入临界段 */
    rt_enter_critical();

	/* 直到字符串结束 */
    while (*str!='\0')
	{
		/* 换行 */
        if (*str=='\n')
		{
			USART_SendData(DEBUG_USARTx, '\r'); 
			while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
		}

		USART_SendData(DEBUG_USARTx, *str++); 				
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);	
	}	

	/* 退出临界段 */
    rt_exit_critical();
}

还有一点要注意,若程序中调用了rt_kprintf()函数,则必须在rtconfig.h使能RT_USING_CONSOLE,即

#define RT_USING_CONSOLE    // 使能,不要注释掉

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值