今天整个RTT在板上跑跑,开发环境是Keil,挺方便使用led_demo
pack中安装好rtt后,直接勾上就可以
编译一下,有三个错误,均是未定义
分别是时钟配置和字符获取,全局搜索下
找到需要的类型
// Updates the variable SystemCoreClock and must be called
// whenever the core clock is changed during program execution.
extern void SystemCoreClockUpdate(void);
// Holds the system core clock, which is the system clock
// frequency supplied to the SysTick timer and the processor
// core clock.
extern uint32_t SystemCoreClock;
extern char rt_hw_console_getchar(void);
AC78XX的.s启动文件中进行SystemInit时已经对时钟初始化过了
先将SystemCoreClockUpdate、rt_hw_console_getchar两个函数创建为空的函数
而SystemCoreClock内核时钟根据SystemInit中进行推算
将mdelay替换成rt_thread_mdelay
编译后无错误,download进开发板,发现LED有闪烁但是控制台没有打印
调试后发现串口没有初始化,且rt_hw_console_output为弱函数
RT_WEAK void rt_hw_console_output(const char *str)
{
/* empty console output */
}
原以为接收暂时不用可以先空着,没想到发送也是空的
那好办,将这两个函数重写下吧
char rt_hw_console_getchar(void)
{
char ch = -1;
if (s_debugInit)
{
if (UART_RxIsDataReady(DEBUG_UART))
{
ch = UART_ReceiveData(DEBUG_UART);
}
}
return ch;
}
void rt_hw_console_output(const char *str)
{
/* empty console output */
// printf("%s",str);
/* 进入临界段 */
rt_enter_critical();
/* 直到字符串结束 */
while ( *str != '\0' )
{
/* 换行 */
//RT-Thread 系统中已有的打印均以 \n 结尾,而并非 \r\n,所以在字符输出时,需要在输出 \n 之前输出 \r,完成回车与换行,否则系统打印出来的信息将只有换行
if ( *str == '\n' )
{
UART_SendData(DEBUG_UART, '\r' );
while ( UART_TxIsFinished( DEBUG_UART) == 0 );
}
UART_SendData(DEBUG_UART, *str++ );
while ( UART_TxIsFinished( DEBUG_UART) == 0);
}
/* 退出临界段 */
rt_exit_critical();
}
这样就可以正常发送接收了吧
天不遂人愿,堆栈溢出了
好吧,继续修改栈大小
这下终于OK了,控制台有输入输出了,LED也愉快的闪起来了
最后总结,这种方式只适用于像我这种初学RTOS的,进行简单的工程建立体验RTT
不建议在实际开发中,实际开发中还请使用 env 和 scons辅助工具来裁剪功能和组织文件
|