RTOS专栏(一) —— rt-thread简单介绍和qemu使用
RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。支持多任务,任务和任务之间的调度通过任务调度器来实现,(实际上一个处理器核心在某一时刻只能处理一个任务,通过任务调度器看起来像一次性处理多个任务),在rt-thread中,任务是通过线程来实现的;RT-Thread 系统完全开源,遵循 Apache License 2.0 开源许可协议,可以免
·
本期主题:
- 简单介绍rt-thread
- 介绍qemu和rt-thread怎么配合使用
- qemu的简单例子
rt-thread & qemu
1.rt-thread介绍
RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。
RT-thread的几个特点:
支持多任务
,任务和任务之间的调度通过任务调度器来实现,(实际上一个处理器核心在某一时刻只能处理一个任务,通过任务调度器看起来像一次性处理多个任务),在rt-thread中,任务是通过线程来实现的;RT-Thread 系统完全开源
,遵循 Apache License 2.0 开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码,没有潜在商业风险。
2.qemu介绍
qemu的官方文档介绍在这里:qemu官方文档
简单来概括就是:
qemu是一个开源的模拟硬件的工具,能够模拟多种硬件(ARM A9、stm32xx…等等),开发的时候使用qemu能够避免很多硬件上的问题;
qemu的安装方式:
sudo apt-get install qemu-system-arm
安装好之后,在你输入qemu之后是能够自动补齐的,如下所示:
3.搭建rt-thread和qemu开发环境
简单概括就是几个步骤:
- 拉rt-thread的源码
- 安装好qemu
- 配置rt-thread所需环境,例如Scons等
- 最后编译,运行
参考官方文档:
ubuntu上开发rt-thread
成功后使用qemu.sh脚本运行,应该是能够看到如下现象:
4.简单例子
例子功能:
rt-thread新建2个线程,一个线程优先级高,运行10次后退出,另一个一直运行,优先级低,通过MSH_CMD来触发任务运行
#include <rtthread.h>
#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5
static rt_thread_t tid1 = RT_NULL;
/* 线程 1 的入口函数 */
static void thread1_entry(void *parameter)
{
rt_uint32_t count = 0;
while (1)
{
/* 线程 1 采用低优先级运行,一直打印计数值 */
rt_kprintf("thread1 count: %d\n", count ++);
rt_thread_mdelay(500);
}
}
ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
/* 线程 2 入口 */
static void thread2_entry(void *param)
{
rt_uint32_t count = 0;
/* 线程 2 拥有较高的优先级,以抢占线程 1 而获得执行 */
for (count = 0; count < 10 ; count++)
{
/* 线程 2 打印计数值 */
rt_kprintf("thread2 count: %d\n", count);
}
rt_kprintf("thread2 exit\n");
/* 线程 2 运行结束后也将自动被系统脱离 */
}
/* 线程示例 */
int thread_sample(void)
{
/* 创建线程 1,名称是 thread1,入口是 thread1_entry*/
tid1 = rt_thread_create("thread1",
thread1_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
/* 如果获得线程控制块,启动这个线程 */
if (tid1 != RT_NULL)
rt_thread_startup(tid1);
/* 初始化线程 2,名称是 thread2,入口是 thread2_entry */
rt_thread_init(&thread2,
"thread2",
thread2_entry,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
THREAD_PRIORITY - 1, THREAD_TIMESLICE);
rt_thread_startup(&thread2);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(thread_sample, thread sample);
运行结果:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)