RT-thread初学

  • 线程
    • 动态创建线程
    • 静态创建线程
    • 钩子函数
  • 定时器
    • 获取系统时间
    • 动态创建定时器
    • 静态创建定时器
  • 信号量
    • 静态创建与动态创建信号量
    • 信号量实例
  • 互斥量(互斥锁)
    • 动态创建互斥量
    • 互斥量实例
  • 注意

线程

动态创建线程

/*任务回调函数*/
void rtt1_entry(void *parameter)
{for(int i = 0;i<5;i++){rt_kprintf("run1:%d\n",i);rt_thread_delay(1000);}
}
 /*动态创建函数*/rtt1_ptr = rt_thread_create("rtt1",rtt1_entry,NULL,1024,1,5);if(rtt1_ptr == RT_NULL){LOG_E("Thread creation 1 failure\n");}else{LOG_D("Thread created 1 successfully\n");rt_thread_startup(rtt1_ptr);}

静态创建线程

/*简要:任务2回调函数*/
void rtt2_entry(void *parameter)
{for(int i = 0;i<5;i++){rt_kprintf("run2:%d\n",i);rt_thread_delay(1000);}//rt_thread_delete(rtt1_ptr);
}
 /*静态创建函数*/int ret = rt_thread_init(&rtt2_ptr,"rtt2",rtt2_entry,NULL,rtt2_stack,sizeof(rtt2_stack),2,5);if(ret == 0){LOG_D("Thread created 2 successfully\n");rt_thread_startup(&rtt2_ptr);}else {LOG_E("Thread creation 2 failure\n");}

钩子函数

在整个系统的运行时,系统都处于线程运行、中断触发 - 响应中断、切换到其他线程,甚至是线程间的切换过程中,或者说系统的上下文切换是系统中最普遍的事件。有时用户可能会想知道在一个时刻发生了什么样的线程切换,可以通过调用下面的函数接口设置一个相应的钩子函数。在系统线程切换时,这个钩子函数将被调用

/*简要:钩子函数*/
void scheduler_hook(struct rt_thread *from, struct rt_thread *to)
{//rt_kprintf("from:%s ---> to:%s\n",from->name,to->name);
}
rt_scheduler_sethook(scheduler_hook);

定时器

RT-Thread 的定时器提供两类定时器机制:第一类是单次触发定时器,这类定时器在启动后只会触发一次定时器事件,然后定时器自动停止。第二类是周期触发定时器,这类定时器会周期性的触发定时器事件,直到用户手动的停止,否则将永远持续执行下去。

获取系统时间

int main(void)
{for(int i = 0;i<10;i++){/*获取系统时间*/rt_tick_t num = rt_tick_get();rt_kprintf("tick : %u\n",num);rt_thread_mdelay(500);}return 0;
}

动态创建定时器

/** 简要:动态定时器的回调函数*/
void tim1_demo(void *parameter)
{rt_kprintf("tim1 run\n");
}
 rt_timer_t tim_1 = NULL;/*动态创建定时器(周期)*/tim_1 = rt_timer_create("tim1",tim1_demo,RT_NULL,3000,RT_TIMER_FLAG_PERIODIC);/*启动定时器*/if(tim_1 != RT_NULL)rt_timer_start(tim_1);

静态创建定时器

/** 简要:静态定时器的回调函数*/
void tim2_demo(void *parameter)
{rt_kprintf("tim2 run\n");
}
 struct rt_timer tim_2;/*静态创建定时器(单次)*/rt_timer_init(&tim_2,"tim2",tim2_demo,RT_NULL,3000,RT_TIMER_FLAG_ONE_SHOT);/*启动定时器*/rt_timer_start(&tim_2);

信号量

以生活中的停车场为例来理解信号量的概念:

①当停车场空的时候,停车场的管理员发现有很多空车位,此时会让外面的车陆续进入停车场获得停车位;

②当停车场的车位满的时候,管理员发现已经没有空车位,将禁止外面的车进入停车场,车辆在外排队等候;

③当停车场内有车离开时,管理员发现有空的车位让出,允许外面的车进入停车场;待空车位填满后,又禁止外部车辆进入。

在此例子中,管理员就相当于信号量,管理员手中空车位的个数就是信号量的值(非负数,动态变化);停车位相当于公共资源(临界区),车辆相当于线程。车辆通过获得管理员的允许取得停车位,就类似于线程通过获得信号量访问公共资源。

静态创建与动态创建信号量

rt_sem_t rs1 = NULL;
struct rt_semaphore rs2;
int main(void)
{/*动态创建信号量*/rs1 = rt_sem_create("dsem",0,RT_IPC_FLAG_PRIO);if(rs1 == RT_NULL){LOG_E("dsem no\n");return -1;}else{LOG_D("dsem yes\n");}/*静态创建信号量*/rt_sem_init(&rs2,"dsem2",0,RT_IPC_FLAG_PRIO);return RT_EOK;
}

信号量实例

/*全局变量*/
rt_sem_t rs1 = NULL;
rt_sem_t rs2 = NULL;
rt_thread_t rm1 = NULL;
rt_thread_t rm2 = NULL;
int num = 0;/*任务1*/
void dome1_task(void *parameter)
{while(1){rt_sem_take(rs1,RT_WAITING_FOREVER);num++;rt_kprintf("[num: %d]dome1_task run\n",num);if(num == 100){num = 0;}rt_sem_release(rs2);rt_thread_mdelay(1000);}
}/*任务2*/
void dome2_task(void *parameter)
{while(1){rt_sem_take(rs2,RT_WAITING_FOREVER);if(num > 0){num--;rt_kprintf("[num: %d]dome2_task run\n",num);}rt_sem_release(rs1);rt_thread_mdelay(3000);}
}/*主函数*/
int main(void)
{/*创建信号量1*/rs1 = rt_sem_create("dsem1",1,RT_IPC_FLAG_PRIO);if(rs1 == RT_NULL){LOG_E("dsem1 no\n");return -1;}else{LOG_D("dsem1 yes\n");}/*创建信号量2*/rs2 = rt_sem_create("dsem2",0,RT_IPC_FLAG_PRIO);if(rs2 == RT_NULL){LOG_E("dsem2 no\n");return -1;}else{LOG_D("dsem2 yes\n");}/*创建线程1*/rm1 = rt_thread_create("dome1",dome1_task,NULL,512,20,5);if(rm1 == RT_NULL){LOG_E("dome1 rt_thread_create NO\n");return -1;}else{LOG_D("dome1 rt_thread_create YES\n");rt_thread_startup(rm1);}/*创建线程2*/rm2 = rt_thread_create("dome2",dome2_task,NULL,512,20,5);if(rm2 == RT_NULL){LOG_E("dome2 rt_thread_create NO\n");return -1;}else{LOG_D("dome2 rt_thread_create YES\n");rt_thread_startup(rm2);}return -1;
}

互斥量(互斥锁)

互斥量又叫相互排斥的信号量,是一种特殊的二值信号量。互斥量类似于只有一个车位的停车场:当有一辆车进入的时候,将停车场大门锁住,其他车辆在外面等候。当里面的车出来时,将停车场大门打开,下一辆车才可以进入。

动态创建互斥量

 rt_mutex_t Motor = NULL;/*动态创建互斥锁*/Motor = rt_mutex_create("Motor",0);if (Motor == RT_NULL){rt_kprintf("Motor rt_mutex_create NO");return -1;}

互斥量实例

/*全局变量*/
rt_thread_t t1 = NULL;
rt_thread_t t2 = NULL;
rt_mutex_t Motor = NULL;
int num1 = 0,num2 = 0;/*线程1回调函数*/
void task1_main(void *parameter)
{while(1){rt_mutex_take(Motor,RT_WAITING_FOREVER);num1++;rt_thread_mdelay(500);num2++;rt_mutex_release(Motor);}
}/*线程2回调函数*/
void task2_main(void *parameter)
{while(1){rt_mutex_take(Motor,RT_WAITING_FOREVER);if(num1 != num2){rt_kprintf("num1:%d != num2:%d\n",num1,num2);}else {rt_kprintf("num1:%d == num2:%d\n",num1,num2);}rt_thread_mdelay(500);rt_mutex_release(Motor);if(num1>58){return;}}
}int main(void)
{/*动态创建互斥锁*/Motor = rt_mutex_create("Motor",0);if (Motor == RT_NULL){rt_kprintf("Motor rt_mutex_create NO");return -1;}/*动态创建线程1*/t1 = rt_thread_create("task1",task1_main,RT_NULL,512,15,500);if(t1 != RT_NULL){LOG_D("task1 rt_thread_create YES");rt_thread_startup(t1);}else {LOG_E("task1 rt_thread_create NO");return -1;}/*动态创建线程2*/t2 = rt_thread_create("task2",task2_main,RT_NULL,512,17,500);if(t2 != RT_NULL){LOG_D("task2 rt_thread_create YES");rt_thread_startup(t2);}else {LOG_E("task2 rt_thread_create NO");return -1;}return RT_EOK;
}

注意

  • 线程任务执行完,线程不是挂起,而是删除了
  • 在获得互斥量后,请尽快释放互斥量,并且在持有互斥量的过程中,不得再行更改持有互斥量线程的优先级,否则可能人为引入无界优先级反转的问题。
  • 需要切记的是互斥量不能在中断服务例程中使用。

RT-thread初学相关推荐

  1. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  2. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  3. rt thread 使用FAL遇到fal_init() undefined reference

    rt thread FAL 0.5版,之前有没有不知道,遇到一个坑. 在main.cpp里面已经 #include <fal.h> fal_init() 编译报错,说 fal_init() ...

  4. RT Thread Free Modbus移植问题整理

    RT Thread Free Modbus移植问题整理 问题描述: 在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常. 在移植过程中发现串口(或RS485)数据接收长度异常. 一.环境描 ...

  5. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  6. RT Thread根据开发板制作BSP方法

    之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...

  7. RT Thread之 Uart2 操作

    官网连接:https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/device/uar ...

  8. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  9. RT Thread利用STM32CUBEMX和RT Thread studio来创建模板工程

    (1)RT Thread利用STM32CUBEMX来创建模板工程 1.参考文档: 基于 CubeMX 移植 RT-Thread Nano:RT-Thread 文档中心 注意:串口2必须使能异步模式(启 ...

  10. rt thread系统下添加wiznet软件包后,不插网线CPU利用率100%问题

    rt thread系统下添加wiznet软件包后如果不插网线的话其他任务运行很卡,使用ps命令发现优先级低的任务很多都超时了 rt thread线程错误码 添加了一个可以查看CPU利用率的软件包CPU ...

最新文章

  1. ZNNT-5NM 扭矩测量模块
  2. 国内国外虚拟主机的对比
  3. pod出现include of non-modular header inside framework module 错误
  4. 【C 语言】二级指针案例 ( 字符串切割 | 返回 二维数组 作为结果 )
  5. Node-RED订阅MQTT主题并调试数据
  6. 将数据库的0和1显示为jsp页面的是和否
  7. mysql导入sql脚本命令
  8. em算法详细例子及推导_第九章-EM算法
  9. Linux中一些 不是很常用的配置修改
  10. 图像去雾算法_Matlab:单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题...
  11. HDOJ2024C语言合法标识符
  12. 小米6报价参数_对小米11系列你了解多少,你更看好小米11还是小米11pro
  13. Android AsyncTasks并行执行
  14. gatewayfilter详解_Spring Cloud Gateway 之 Filter
  15. Yii 2.0 权威指南 (4) 使用 Gii 生成代码
  16. 全国各省女孩性格+美丽程度比较分析!
  17. 思科 接入点 本地转发_H3C无线AP本地转发配置教程2016
  18. Cadillac CTS-V
  19. 揭秘中国商品期货市场的9大重要因子
  20. python爬虫实例——中国电影票房(续)

热门文章

  1. 全球计算机科学排行榜,最新全球计算机科学排名:清华力压CMU,人工智能第一!北大排第四...
  2. php微擎Goto2C解密研究
  3. 经典数字图像处理素材库
  4. php统计字数函数,微博内容字数统计函数(PHP版)
  5. 北方工业大学编译原理——四、五章单元测试内容复习
  6. 使用AD(Altium Designer)三年的笔记(虽然很口语化,但是好记性不如烂笔头嘛~开熏)
  7. 程序员七夕特刊,绝无狗粮添加
  8. 从诚信的角度探索现代远程教育中的教与学
  9. 那些想不断提高自己技术水平的Java程序员们
  10. 计算机毕业设计ssm基于SSM框架的股票交易系统3cwg3系统+程序+源码+lw+远程部署