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 // 使能,不要注释掉