初学RT-Thread,官网给的历程大多是HAL库版本的,原来做的项目中都是用的固件库,底层驱动移植起来相当麻烦,于是网上找资料动手移植起来,实现功能:①线程中LED闪烁;②软件定时器回调函数打印“timer1 is timeout”;③串口DMA接收数据,邮箱实现线程同步(信号量本已实现,为了验证邮箱实现同样的功能,屏蔽)并打印接收到的数据。
平台:正点原子精英开发板
全部资料51hei下载地址:
RTT-RTC做TICK.7z
(2.03 MB, 下载次数: 29)
RT-Thread-串口DMA接收.7z
(846.48 KB, 下载次数: 60)
STM32单片机源程序如下:
- /*
- *************************************************************************
- * 包含的头文件
- *************************************************************************
- */
- #include "board.h"
- #include "rtthread.h"
- #include <string.h>
- /*
- ******************************************************************
- * 变量
- ******************************************************************
- */
- /* 定义线程控制块 */
- static rt_thread_t usart_thread = RT_NULL;
- /* 定义线程控制块 */
- static rt_thread_t led1_thread = RT_NULL;
- /* 定义信号量控制块 */
- rt_sem_t test_sem = RT_NULL;
- /* 邮 箱 控 制 块 */
- struct rt_mailbox mb;
- /* 用 于 放 邮 件 的 内 存 池 */
- static char mb_pool[128];
- /* 定 时 器 的 控 制 块 */
- static rt_timer_t timer1;
- /************************* 全局变量声明 ****************************/
- /*
- * 当我们在写应用程序的时候,可能需要用到一些全局变量。
- */
- /* 相关宏定义 */
- extern char Usart_Rx_Buf[USART_RBUFF_SIZE];
- /*
- *************************************************************************
- * 函数声明
- *************************************************************************
- */
- static void usart_thread_entry(void* parameter);
- static void led1_thread_entry(void* parameter);
- static void timeout1(void *parameter);
- /*
- *************************************************************************
- * main 函数
- *************************************************************************
- */
- /**
- * @brief 主函数
- * @param 无
- * @retval 无
- */
- int main(void)
- {
- rt_err_t result;
- /*
- * 开发板硬件初始化,RTT系统初始化已经在main函数之前完成,
- * 即在component.c文件中的rtthread_startup()函数中完成了。
- * 所以在main函数中,只需要创建线程和启动线程即可。
- */
- /* 创建一个信号量 */
- //test_sem = rt_sem_create("test_sem",/* 消息队列名字 */
- // 0, /* 信号量初始值,默认有一个信号量 */
- // RT_IPC_FLAG_FIFO); /* 信号量模式 FIFO(0x00)*/
- //if (test_sem != RT_NULL)
- //rt_kprintf("信号量创建成功!\n\n");
- /* 初 始 化 一 个 mailbox */
- result = rt_mb_init(&mb,
- "mbt", /* 名 称 是 mbt */
- &mb_pool[0], /* 邮 箱 用 到 的 内 存 池 是 mb_pool */
- sizeof(mb_pool) / 4, /* 邮 箱 中 的 邮 件 数 目 , 因 为 一 封 邮
- 件 占 4 字 节 */
- RT_IPC_FLAG_FIFO); /* 采 用 FIFO 方 式 进 行 线 程 等 待 */
- if (result != RT_EOK)
- {
- rt_kprintf("init mailbox failed.\n");
- return -1;
- }
- usart_thread = /* 线程控制块指针 */
- rt_thread_create( "usart", /* 线程名字 */
- usart_thread_entry, /* 线程入口函数 */
- RT_NULL, /* 线程入口函数参数 */
- 512, /* 线程栈大小 */
- 2, /* 线程的优先级 */
- 20); /* 线程时间片 */
-
- /* 启动线程,开启调度 */
- if (usart_thread != RT_NULL)
- rt_thread_startup(usart_thread);
- else
- return -1;
-
- led1_thread = /* 线程控制块指针 */
- rt_thread_create( "led1", /* 线程名字 */
- led1_thread_entry, /* 线程入口函数 */
- RT_NULL, /* 线程入口函数参数 */
- 512, /* 线程栈大小 */
- 3, /* 线程的优先级 */
- 20); /* 线程时间片 */
-
- /* 启动线程,开启调度 */
- if (led1_thread != RT_NULL)
- rt_thread_startup(led1_thread);
- else
- return -1;
- /* 创 建 定 时 器 1 周 期 定 时 器 */
- timer1 = rt_timer_create("timer1", timeout1,
- RT_NULL, 2500,
- RT_TIMER_FLAG_PERIODIC);
- /* 启 动 定 时 器 1 */
- if (timer1 != RT_NULL)
- rt_timer_start(timer1);
- }
- /*
- *************************************************************************
- * 线程定义
- *************************************************************************
- */
- static void usart_thread_entry(void* parameter)
- {
- rt_err_t uwRet = RT_EOK;
- char *str;
- /* 任务都是一个无限循环,不能返回 */
- while (1)
- {
- //uwRet = rt_sem_take(test_sem, /* 获取串口中断的信号量 */
- //-1); /* 等待时间:0 */
- uwRet=rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER);
-
- if(RT_EOK == uwRet)
- {
- //rt_kprintf("收到数据:%s\n",Usart_Rx_Buf);
- rt_kprintf("收到数据:%s\n",str);
- memset(Usart_Rx_Buf,0,USART_RBUFF_SIZE);/* 清零 */
- }
- }
- }
- static void led1_thread_entry(void* parameter)
- {
- while (1)
- {
- LED1_ON;
- rt_kprintf("LED1_ON\r\n");
- rt_thread_delay(5000); /* 延时500个tick */
-
- LED1_OFF;
- rt_kprintf("LED1_OFF\r\n");
- rt_thread_delay(5000); /* 延时500个tick */
- }
- }
- /* 定 时 器 2 超 时 函 数 */
- static void timeout1(void *parameter)
- {
- rt_kprintf("timer1 is timeout\n");
- }
- /********************************END OF FILE****************************/
复制代码
|