说明:记录日常使用 RT_Thread 开发时做的笔记。
1.打印相关
1.打印宏定义,可以打印打印所在文件,函数,行数。
#define PRINT_TRACE() printf("-------%s:%s:%d------\r\n", __FILE__, __FUNCTION__, __LINE__);
2. rt thread 3.1.5 nano版本中添加 rt_kprintf() 函数功能
.1 rtconfig.h头文件中开启控制台相关宏 #define RT_USING_CONSOLE
.2 在 board.c 中 添加串口初始化函数 和 rt_kprintf() 串口输出调用的函数 rt_hw_console_output()
#ifdef RT_USING_CONSOLE
static int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."
USART1_Init();
return 0;
}
INIT_BOARD_EXPORT(uart_init);
void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."
/* empty console output */
rt_enter_critical();
while (*str != '\0')
{
HAL_UART_Transmit(&Uart1Handle, (uint8_t *) (str++), 1, 1000);
}
rt_exit_critical();
}
#endif
3. printf 重定向
可通过搜索功能查找到函数 fputc(),修改函数体中的串口数据发送函数。
/* printf 重定向 */
int fputc(int ch, FILE *f)
{
#if PRINTF_PORT_JLINK
SEGGER_RTT_PutChar(0, ch);
#else
HAL_UART_Transmit(&Uart1Handle, (uint8_t *)&ch, 1, 1000);
#endif
return (ch);
}
int fgetc(FILE *f)
{
int ch;
HAL_UART_Receive(&Uart1Handle, (uint8_t *)&ch, 1, 1000);
return (ch);
}
2. MSH 控制台功能
1. rt thread 3.1.5 nano版本中添加 MSH 控制台功能
.1 在 keil 软件包中勾选 shell 功能
.2 在 finsh_port.c 中看提示开启宏和串口接收函数。
添加 shell 功能后编译 在 finsh_port.c 文件中会有2个错误的提示。
/* 在 rtconfig.h 中开启 #include "finsh_config.h 宏 */
#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h
#endif
#ifdef RT_USING_FINSH
/* 定义串口接收功能 */
RT_WEAK char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
//#error "TODO 4: Read a char from the uart and assign it to 'ch'."
return ch;
}
#endif /* RT_USING_FINSH */
.3 定义一个接收函数,放到 rt_hw_console_getchar 中调用
前提:串口已经实现了对串口数据的接收,接收的数据存储在了接收缓存中,缓存的前2个字节用于存储 shell 取了第几个字节数据,第3个字节开始存储串口收到的数据。
void read_uart1_ch(int *ch)
{
uint16_t *count = NULL;
count = (uint16_t *)usart1_rx_buf;
*ch = usart1_rx_buf[*count];
if (*ch == 0)
{
*ch = -1;
}
else
{
*count = *count +1;
}
}
3.调试笔记:
1.rt thread 内存申请失败调试笔记
问题描述:
1.在线程中调用了一个函数A,该函数会申请内存函数结束前会再释放。测试中发现这个函数在线程中调用几次后就提示异常,申请不到内存。
2:请教:内存的释放 是否是在 rt_free 后就完成?
3:大概逻辑
线程()
{
while(n)
{
调用函数:A(申请内存,执行相关工作,释放内存);
延时;
调用函数:A(申请内存,执行相关工作,释放内存);
延时;
}
}
问题已解决自己回答:
1:调试发现内存堆分配了15K,关掉发现问题的线程后,发现系统跑起来其他线程都运行后,内存最大已经使用了13K多,这就反应了为什么前几次能申请到内存后面就申请不到了,因为这个线程运行的比较早开始时内存充足可以申请到,后面问题线程延时时系统调度启动了别的线程,导致内存堆空间减少,延时结束继续申请内存时就出现了内存不足。
2:增大内存堆后问题解决。
2. rt-thread 3.1.5 内存堆大小设置
.1 修改位置
在 board.c 文件中修改 #define RT_HEAP_SIZE (30*1024)
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
* Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
*/
#define RT_HEAP_SIZE (30*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
.2 官方介绍: RT-Thread 堆区大小设置
链接:https://www.cnblogs.com/jzcn/p/16427067.html
介绍了 RT-THREAD 内存堆的设置,STM32内存分布情况。