一、线程
—>定义线程控制块指针:static rt_thread_t xxx_thread = RT_NULL;(xxx自定义)
—>线程函数声明:static void xxx_thread_entry(void* parameter);(xxx自定义)
—>创建线程:rt_thread_create();
//创建线程
key_thread = /* 线程控制块指针 */
rt_thread_create("receive", /* 线程名字 */
key_thread_entry, /* 线程入口函数 */
RT_NULL, /* 线程入口函数参数 */
512, /* 线程栈大小 */
3, /* 线程的优先级 */
20); /* 线程时间片 */
if(key_thread != RT_NULL)
rt_thread_startup(key_thread); //启动线程,开启调度
else
return -1;
—>重映射串口到 rt_kprintf 函数,在board.c文件下添加如下代码(注意串口初始化)
void rt_hw_console_output(const char *str)
{
/* 进入临界段 */
rt_enter_critical();
/* 直到字符串结束 */
while (*str!='\0')
{
/* 换行 */
if (*str=='\n')
{
USART_SendData(CUSTOM_USARTx, '\r');
while (USART_GetFlagStatus(CUSTOM_USARTx, USART_FLAG_TXE) == RESET);
}
USART_SendData(CUSTOM_USARTx, *str++);
while (USART_GetFlagStatus(CUSTOM_USARTx, USART_FLAG_TXE) == RESET);
}
/* 退出临界段 */
rt_exit_critical();
}
—>延时函数:rt_thread_delay(xx);(xx自定义)
二、信号量
—>定义信号量控制块指针:rt_sem_t xxx_sem = NULL;
—>创建信号量线程:rt_sem_create();
xxx_sem = rt_sem_create("xxx_sem", 0, RT_IPC_FLAG_FIFO);
if(xxx_sem != RT_NULL)
rt_kprintf("信号量创建成功!\r\n");
—>释放信号量:rt_sem_release(xxx_sem);
—>获取信号量:rt_sem_take();
rt_sem_take(test_sem, /* 获取信号量 */
RT_WAITING_FOREVER); /* 等待时间:一直等 */
三、邮箱
—>定义邮箱控制块指针:rt_mailbox_t xxx_mail = NULL;
—>创建信号量线程:rt_mb_create();
xxx_mail = rt_mb_create("xxx_mail", /* 邮箱名字 */
10, /* 邮箱大小 */
RT_IPC_FLAG_FIFO);/* 信号量模式 FIFO(0x00)*/
if (xxx_mail != RT_NULL)
rt_kprintf("邮箱创建成功!\n\n");
—>邮件发送:rt_mb_send();
rt_err_t uwRet = RT_EOK;
uwRet = rt_mb_send(xxx_mail, (rt_uint32_t)&USART_RX_Cmd); //USART_RX_Cmd为数组名
if(RT_EOK == uwRet)
rt_kprintf ( "邮箱消息发送成功\n" );
else
rt_kprintf ( "邮箱消息发送失败\n" );
—>邮件接收:rt_mb_recv();
rt_err_t uwRet = RT_EOK;
char *r_str;
uwRet = rt_mb_recv(test_mail, /* 邮箱对象句柄 */
(rt_uint32_t*)&r_str, /* 接收邮箱消息 */
RT_WAITING_FOREVER);/* 指定超时事件,一直等 */
if(RT_EOK == uwRet) /* 如果接收完成并且正确 */
{
rt_kprintf ( "邮箱的内容是:%s\n\n",r_str);
LED1_TOGGLE; //LED1 反转
}
else
rt_kprintf ( "邮箱接收错误!错误码是0x%x\n",uwRet);