\ } while(0) 以内核的调度锚点rt_scheduler_hook为例,它的"等效"函数原型如下: void __on_rt_scheduler_hook(struct rt_thread *from, struct rt_thread *to); 因此,我们只需要在rtconfig.h(或其直接、间接包含的头文件)中定义如下的宏: #define __on_rt_scheduler_hook 为了避免这类情况的发生,我们可以在定义插入宏时顺便引入对应的函数原型: extern void my_scheduler_notifier(struct rt_thread *from, struct rt_thread *to); #define __on_rt_scheduler_hook(__from, __to) \ my_scheduler_notifier((__from),
文章目录 [攻城狮计划]|如何优雅的在RA2E1上运行RT_Thread 准备阶段 开发板 开发环境 下载BSP 编译烧录 连接串口 总结 [攻城狮计划]|如何优雅的在RA2E1上运行RT_Thread 好了,接下来我们开始进入今天的主题,如何在在RA2E1上优雅地运行RT_Thread! 同时本文会介绍大量在移植过程中遇到的问题,争取做到大家都能完美复现。 ---- 下载BSP 接下来我们就需要下载我们的RT_Thread的代码了,这个地方因为官方没有为这款芯片做专门的BSP包,所以我们是基于RA2L1进行修改的,在这过程中遇到了许多的问题,其中最困难的地方就在于两个芯片的内存不一样 ,所以就直接在这给出下载链接,不再折磨大家了,如果大家对这方面的故事感兴趣,可以参考李老师写的文章:终于在RA2E1上跑通了RT_Thread。
因此对于 rt_thread 中的线程对象,内存池对象,定时器对象也可以用如下的一张图表明他们之间的关系。 [在这里插入图片描述]上述就是关于继承的概念及 C 语言的具体的实现方式。 node. */ struct rt_list_node *prev; /**< point to prev node. */ }; 由于 rt_thread RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread), sizeof(struct rt_thread object_list), &(rt_object_container[c].object_list)} 其所用是初始化对象的链表,将头尾指针都指向自身,实现的效果如下: [在这里插入图片描述]所以总体来说,rt_thread type == type) return &rt_object_container[index]; return RT_NULL; } 总结 通过 C 语言实现的继承与派生,rt_thread
因此对于 rt_thread 中的线程对象,内存池对象,定时器对象也可以用如下的一张图表明他们之间的关系。 ? 上述就是关于继承的概念及 C 语言的具体的实现方式。 node. */ struct rt_list_node *prev; /**< point to prev node. */ }; 由于 rt_thread RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread), sizeof(struct rt_thread 所以总体来说,rt_thread 中实现的容器里的内容就包含每一个内核对象,然后内核对象是由一个结构体实现的,结构体包含着内核对象的类型,初始化好的内核对象链表以及内核对象的大小。 == type) return &rt_object_container[index]; return RT_NULL; } 总结 通过 C 语言实现的继承与派生,rt_thread
/* 线程控制块 */ struct rt_thread { /* rt 对象 */ char name[RT_NAME_MAX]; /* 线程名称 */ 在系统线程切换时,这个钩子函数将被调用: void rt_scheduler_sethook(void (*hook)(struct rt_thread* from, struct rt_thread * to)); 钩子函数 hook() 的声明如下: void hook(struct rt_thread* from, struct rt_thread* to); 函数参数 描述 from 表示系统所要切换出的线程控制块指针 to 表示系统所要切换到的线程控制块指针 运行代码 rt_thread_t th1_ptr = NULL; struct rt_thread th2; \n"); rt_thread_mdelay(1000); } } void scheduler_hook(struct rt_thread* from, struct rt_thread
Core添加app_rt_thread.c文件,并添加如下代码 #include "rtthread.h" #include "main.h" #include "stdio.h" struct rt_thread 开启线程调度 rt_thread_startup(&led_thread); } //主任务 void MX_RT_Thread_Process(void) { printf("Hello RT_Thread
三、线程的工作机制 1.线程控制块 在RT-Thread 中,线程控制块由结构体struct rt_thread 表示,线程控制块是操作系统用于管理线程的一个数据结构,它会存放线程的一些信息,例如优先级 、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等,详细定义如下: /* 线程控制块*/ struct rt_thread { /* rt 对象*/ char name 2.初始化和脱离线程 (1)初始化线程 线程的初始化可以使用下面的函数接口完成,来初始化静态线程对象: rt_err_t rt_thread_init(struct rt_thread* thread, 在系统线程切换时,这个钩子函数将被调用: void rt_scheduler_sethook(void (*hook)(struct rt_thread* from, struct rt_thread* , struct rt_thread* to); 参数 描述 from 表示系统所要切换出的线程控制块指针 to 表示系统所要切换到的线程控制块指针 !!!
static struct rt_thread thread2; (正常使用前时要rt_thread_startup,完时要记得 - rt_thread_detach将该线程控制块从对象管理器中脱离
share_source=copy_web Part1教程计划 1第一阶段 基于Alios DevelopeKit开发板(主控STM32L496VGT6); HAL库与cubemx开发,RT_THread 操作系统使用; 2第二阶段 专注一些模组、小项目的开发使用,编写Alios DevelopeKit开发板板载传感器驱动; 转入RT-Thread标准版,使用RT-Thread软件包、驱动库等开发,学习完整版RT_Thread Part3已发布HAL与cubemx与rt-thread教程 6RT_thread实战笔记 RT_thread实战笔记 7HAL与cubemx系列教程 HAL与cubemx系列教程 8初学者适用 别纠结了
新建RT_Thread工程 文件->新建->RT_Thread项目 ? 工程名字,自己起个名字就OK了,注意不要含有中文 基于芯片 RT_thread版本选择最新的即可 芯片选择STM32F103RE(选择自己的~) 控制台串口,根据板子硬件设计选择 调试器及接口 ST_LINK
thread */ {RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread), sizeof(struct rt_thread thread = (struct rt_thread *)rt_object_allocate(RT_Object_Class_Thread,
小飞哥结缘RT_Thread是去年参加全连接大赛,获得了个优秀奖,参赛项目是无线重力感应遥控小车,项目完整资料已经开源,小伙伴们可以自行获取,话不多说,开淦! ? RT-Thread IIC设备驱动使用 习惯于MCU BSP驱动开发的玩家来说,初识RT_Thread的设备驱动可能有点蒙,原因在于RT_thread代码结构大多是面向对象的,类linux风格,学习过linux
3 程序分析 该程序是单纯的点灯程序,调用的是RT_Thread的通用驱动模型。 ? 如果要知道引脚标号对应的引脚,可以查看driver/pin_map.c文件 ?
其实网上使用的还是很少,不过网上还是有几个比较好的的stm32结合ROS使用的代码,其中有一个stm32rc和rtt的配置,不过RTT的配置我使用之后发现有些问题,已经给RTT在github的仓库提交了问题 不过RT_Thread
if ((sensors & INV_WXYZ_QUAT)&&(more==0))run_err++; } return run_err; } Rt_thread
这里我们打开一个 rt_thread 的工程为例,初次打开时,会出现一部分头文件找不到的情况,如下图所示的红色字体: ?
static char mb_str3[] = “over”; ALIGN(RT_ALIGN_SIZE) static char thread1_stack[1024]; static struct rt_thread 执行邮箱对象脱离 */ rt_mb_detach(&mb); } ALIGN(RT_ALIGN_SIZE) static char thread2_stack[1024]; static struct rt_thread static rt_uint8_t msg_pool[2048]; ALIGN(RT_ALIGN_SIZE) static char thread1_stack[1024]; static struct rt_thread detach mq \n”); rt_mq_detach(&mq); } ALIGN(RT_ALIGN_SIZE) static char thread2_stack[1024]; static struct rt_thread
//线程时间片 /* 静态线程参数定义 */ ALIGN(RT_ALIGN_SIZE) static char led1_stack[1024]; //线程栈内存空间 static struct rt_thread
RT-Thread version information list_thread - list thread …… 运行 hello 命令,运行结果如下所示: msh />hello hello RT_Thread
return RT_EOK; } INIT_DEVICE_EXPORT(ap3216c_test); 然后编译烧录,通过list_device就可以看到相对应的设备(pr_ap和li_ap),如下: RT_Thread