代码比较简单,就是测试串口
#define BUFF_SIZE_128 128
#define BUFF_SIZE_256 256
#define BUFF_SIZE_512 512
#define UART_USER_UI_CMD "uart2"
/* 串口设备句柄 */
static rt_device_t uart_ui_cmd;
/* 消息队列控制块 */
static struct rt_messagequeue rx_mq;
/* 串口输出数据长度 */
static rt_uint8_t console_length = 0;
/* 发送输出内容 */
rt_err_t console(char *msg, rt_uint8_t length)
{
console_length = length;
rt_err_t result = rt_mq_send(&rx_mq, msg, length);
return result;
}
/* 循环输出hello */
void write_thread(void *parameter)
{
while (1)
{
console("hello\r\n", 7);
rt_thread_mdelay(2000);
}
}
/* 接收输出消息,在串口打印输出内容 */
void uart_ui_cmd_thread(void *parameter)
{
rt_err_t result;
rt_uint32_t rx_length;
static char rx_buffer[BUFF_SIZE_128];
while (1)
{
rt_memset(rx_buffer, 0, BUFF_SIZE_128);
/* 从消息队列中读取消息*/
result = rt_mq_recv(&rx_mq, rx_buffer, BUFF_SIZE_128, RT_WAITING_FOREVER);
if (result == RT_EOK)
{
//输出操作
rt_device_write(uart_ui_cmd, 0, rx_buffer, console_length);
}
}
}
/* 线程句柄 */
rt_thread_t thread, thread2;
/* 消息队列存储空间 */
static char msg_pool[BUFF_SIZE_256];
int uart_ui_cmd_start(void)
{
rt_err_t ret = RT_EOK;
/* 查找串口设备 */
uart_ui_cmd = rt_device_find(UART_USER_UI_CMD);
if (!uart_ui_cmd)
{
return RT_ERROR;
}
/* 初始化消息队列 */
rt_mq_init(&rx_mq, "rx_mq",
msg_pool, /* 存放消息的缓冲区 */
8, /* 一条消息的最大长度 */
BUFF_SIZE_256, /* 存放消息的缓冲区大小 */
RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */
/* 以 DMA 接收及DMA发送方式打开串口设备 */
rt_device_open(uart_ui_cmd, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
/* 创建 thread 线程 */
thread = rt_thread_create("waiter", uart_ui_cmd_thread, RT_NULL, BUFF_SIZE_512, 25, 10);
/* 创建 thread2 线程 */
thread2 = rt_thread_create("writer", write_thread, RT_NULL, BUFF_SIZE_256, 26, 10);
/* 创建成功则启动线程 */
if (thread != RT_NULL)
{
rt_thread_startup(thread);
rt_thread_startup(thread2);
ret = RT_EOK;
}
else
{
ret = RT_ERROR;
}
return ret;
}
当把这个的栈设置为128时,打印一次hello,第二次就挂掉。
_thread2 = rt_thread_create("writer", write_thread, RT_NULL, BUFF_SIZE_128, 26, 10);
__rt_scheduler_stack_check,
进入 while(level)循环。
我现在有2个困惑,我的thread2中没有使用过多的变量,128字节的栈空间怎么会用光,这栈空间里面存储的是什么?
第一次能输出hello也就说明空间够用,为什么会在第二次调用console时会用光,第二次调用比第一次调用增加了什么内容?
这么看来就不富余了,对线程栈的认识还是不够深入