首页 > 编程语言 >RT-Thread的信号 在keil中使用程序框架

RT-Thread的信号 在keil中使用程序框架

时间:2022-12-05 13:00:15浏览次数:35  
标签:RT rt Thread keil 信号量 线程 semaphore test sem

按照如下方式,添加信号,使用信号

信号量的原理:

操作系统中的信号量在解决线程之间的同步中起着非常大的作用,那么什么是信号量呢?

百度百科:信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。

维基百科:信号量(英语:Semaphore)又称为信号量、旗语,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一;当线程完成一次对semaphore对象的释放(release)时,计数值加一。当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态.

其中,信号量又分为两种:二进制信号量和计数信号量。

信号量的概念是由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)发明的,广泛的应用于不同的操作系统中。在系统中,给予每一个进程一个信号量,代表每个进程目前的状态,未得到控制权的进程会在特定地方被强迫停下来,等待可以继续进行的信号到来。如果信号量是一个任意的整数,通常被称为计数信号量(Counting semaphore),或一般信号量(general semaphore);如果信号量只有二进制的0或1,称为二进制信号量(binary semaphore)。在linux系统中,二进制信号量(binary semaphore)又称互斥锁(Mutex)。

其中,信号量又存在着两种操作,分别为V操作与P操作,V操作会增加信号量 S的数值,P操作会减少它。

具体的运作方式如下:

初始化,给与它一个非负数的整数值。
运行 P(wait()),信号量S的值将被减少。企图进入临界区块的进程,需要先运行 P(wait())。当信号量S减为负值时,进程会被挡住,不能继续;当信号量S不为负值时,进程可以获准进入临界区块。
运行 V(又称signal()),信号量S的值会被增加。结束离开临界区块的进程,将会运行 V(又称signal())。当信号量S不为负值时,先前被挡住的其他进程,将可获准进入临界区块。
以上是维基百科对于信号量的具体解释,下面是我自己对于信号量的一个理解。
————————————————
版权声明:本文为CSDN博主「刘扬俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_19782019/article/details/79746627

 

/*main.c     cubemx生成的工程文件*/

/* USER CODE BEGIN PV */
。。。
    /* 定义信号量控制块 */
    static rt_sem_t test_sem = RT_NULL;
。。。
/* USER CODE END PV */


。。。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    
     /* 在创建线程之前,创建一个信号量 */
 test_sem = rt_sem_create("test_sem",/* 信号量名字 */
                                                 
                                        1, /* 信号量初始值,默认有一个信号量 */
                                                  
                                          RT_IPC_FLAG_FIFO); /* 信号量模式 FIFO(0x00)*/
                                                 if (test_sem != RT_NULL)
    rt_kprintf("信号量创建成功!\n\n");

。。。
  while (1)
  {
  /* USER CODE END WHILE */


/* USER CODE BEGIN 4 */
static void led1_thread_entry(void* parameter)
{
  /* 线程都是一个无限循环,不能返回 */  
    while(1)
        {
            rt_sem_take(test_sem, /* 获取信号量 */
                                    RT_WAITING_FOREVER); /* 等待时间:一直等 */
                              。。。。
            rt_sem_release(test_sem); //释放二值信号量
            rt_thread_yield(); //放弃剩余时间片,进行一次线程切换            
        }
}
static void led2_thread_entry(void* parameter)
{
    /* 线程都是一个无限循环,不能返回 */
    while(1)
        {
            rt_sem_take(test_sem, /* 获取信号量 */
            RT_WAITING_FOREVER); /* 等待时间:一直等 */
                  。。。

          rt_sem_release( test_sem ); //释放二值信号量            
          rt_thread_delay(500); /* 延时 500 个 tick, 让出CPU */
        }
}
/* USER CODE END 4 */

 

标签:RT,rt,Thread,keil,信号量,线程,semaphore,test,sem
From: https://www.cnblogs.com/excellentHellen/p/16951995.html

相关文章

  • RT-Thread OS支持ESP32的实现方式分析
    ESP-IDF是个筐,啥OS都可以往里面装!ESP32基于一款Xtensa指令集架构的核心,虽然这款IP核知道的人不多,但是提到音频领域鼎鼎大名的HIFI系列DSP,可能很多人不会陌生,事实上,HIFI系列......
  • TortoiseSVN使用问题——错误 请执行“清理”命令
    TortoiseSVN使用问题——错误请执行“清理”命令转载:TortoiseSVN使用问题——错误请执行“清理”命令-假装空白-博客园(cnblogs.com)  ......
  • Linux 下 hwclock 读写 RTC 报错 Invalid argument
    以上错误信息都是因为year设置不当引起的。没有设置RTC,RTC也不会启动计时。下面首先设置正确的系统时间,然后将系统时间传递给RTC。tm里的tm_year是从1900年开始算的,如要......
  • jfreechart火速应用
    JAVA中的图表方面,Jfreechart是十分不错的老大了,网上有个具体的英文手册类库下载可以参考的,下面以一个投票的例子来个火速应用,简单介绍一下首先,可以将投票结果以servlet的形......
  • echart 圆环图配置
    echart版本:5.4.0 let current = 0; // 当前用量let all = 100; // 总量let option = {    animation:false,    backgroundColor:"transpare......
  • 013.注入集合对象(list、set、map、properties)
    1.注入list  2.注入set(不允许重复)  3.注入Map  4.注入Properties ......
  • TortoiseGit自动保存用户名和密码
    在使用TortoiseGit上传时,会多次提示输入用户名和密码,采用以下方法解决1.桌面点击右键->选择TortoiseGit->点击settings2.点击选择Git3.点击EditGlobal.gitcon......
  • c++ thread
     示例:voidtest(inttimes){//子线程睡眠times秒this_thread是当前子线程this_thread::sleep_for(chrono::seconds(times));std::cout<<"hellow......
  • started to fail (ZBX_TCP_READ() timed out)
    #tail-f/var/log/zabbix/zabbix_agentd.log  查看agent日志activecheckconfigurationupdatefrom[114.246.27.164:10051]startedtofail(ZBX_TCP_READ()tim......
  • started to fail (cannot connect to [[192.168.2.1]:10051]: [4] Interrupted system
    52340:20221025:160139.474activecheckconfigurationupdatefrom[192.168.2.1:10051]startedtofail(cannotconnectto[[192.168.2.1]:10051]:[4]Interrupted......