RT-Thread 17. 中断发送信号量后线程去处理信号量

news2024/10/2 8:29:57
1. 代码

//sem.c

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"

#define THREAD_PRIORITY 25
#define THREAD_TIMESLICE 5

#define LED3_PIN GET_PIN(B, 3)
ALIGN(RT_ALIGN_SIZE)
static char thread3_stack[1024];
static struct rt_thread thread3;
static struct rt_semaphore keyPress1_sem;
void KeyScanCallBack(void)
{
  rt_sem_release(&keyPress1_sem); 
}
static void rt_thread3_entry(void *parameter)
{
  static rt_err_t result;
//  static int cnt = 0;
  while(1)
  {
    /* 永 久 方 式 等 待 信 号 量, 获 取 到 信 号 量, 则 执 行 number 自 加 的 操 作 */
    result = rt_sem_take(&keyPress1_sem, RT_WAITING_FOREVER);
    if (result != RT_EOK)
    {
      rt_kprintf("t3 take a static semaphore, failed.\n");
      return;
    }
    else
    {
      rt_kprintf("t3 take a static semaphore");
      rt_pin_write(LED3_PIN, PIN_HIGH);
      rt_thread_mdelay(1000);
      rt_pin_write(LED3_PIN, PIN_LOW);
//      if(++cnt >= 5)
//      {
//        rt_sem_detach(&keyPress1_sem);
//        return;
//      }
    }
  }
}

void Key1PressTaskInit(void)
{
  /* 初 始 化 3 个 信 号 量 */
  rt_sem_init(&keyPress1_sem, "keyPress1_sem", 0, RT_IPC_FLAG_FIFO);
  rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT);
  rt_thread_init(&thread3,
                "thread3",
                rt_thread3_entry,
                RT_NULL,
                &thread3_stack[0],
                sizeof(thread3_stack),
                THREAD_PRIORITY-1, THREAD_TIMESLICE);  
  rt_thread_startup(&thread3);  
}

//usrtimer.c

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"


/* 定时器的控制块 */
static struct rt_timer timer3;
static int cnt = 0;

#define KEY1_PIN GET_PIN(C, 5)

static uint8_t keyVal = 0;

void KeyScanCallBack(void);
static void keyscan(void* parameter)
{
  static uint8_t i = 0;
  uint8_t val;
  
  val = rt_pin_read(KEY1_PIN);
  if(val == 0)
  {
    if(i < 200)
    {
      i ++;
    }
  }
  else
  {
    if(i >= 2)
    {
      keyVal = 1;
      rt_kprintf("key press val is %d\n",keyVal);
      KeyScanCallBack();
      keyVal = 0;
    }
    i = 0;
  }
}

void keyscan_init(void)
{
    rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT);
    rt_timer_init(&timer3, 
                    "timerKeyscan",   /* 定时器名字是 timer2 */
                    keyscan, /* 超时时回调的处理函数 */
                    RT_NULL, /* 超时函数的入口参数 */
                    5, /* 定时长度为 5 个 OS Tick */
                    RT_TIMER_FLAG_PERIODIC); /* 单次定时器 */  

    rt_timer_start(&timer3);
}

//main.c

#include <rthw.h>
#include <stdio.h>
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"
#include "gd32f3x0.h"

/* defined the LED2 pin: PC6 */
#define LED1_PIN GET_PIN(B, 1)
#define LED2_PIN GET_PIN(B, 2)


#define delay_ms(x)   rt_thread_mdelay(x)

#define RT_USR1_THREAD_PRIO        6
#define USR1_THREAD_NAME          "usr1"
static struct rt_thread usr1_thread;
static rt_uint8_t usr1_thread_stack[500];


void rt_thread_usr1_entry(void *parameter)
{
    /* set LED2 pin mode to output */
    rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
    while (1)
    {
        rt_pin_write(LED2_PIN, PIN_HIGH);
        rt_thread_mdelay(2000);
        rt_pin_write(LED2_PIN, PIN_LOW);
        rt_thread_mdelay(3000);
    } 
}

void keyscan_init(void);
void Key1PressTaskInit(void);

int main(void)
{
  
  keyscan_init();
  Key1PressTaskInit();

  rt_thread_init(&usr1_thread,
               USR1_THREAD_NAME,
               rt_thread_usr1_entry,
               RT_NULL,
               &usr1_thread_stack[0],
               sizeof(usr1_thread_stack),
               RT_USR1_THREAD_PRIO,
               20);
  rt_thread_startup(&usr1_thread);

  /* set LED1 pin mode to output */
  rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);

  while (1)
  {
      rt_pin_write(LED1_PIN, PIN_HIGH);
      rt_thread_mdelay(500);
      rt_pin_write(LED1_PIN, PIN_LOW);
      rt_thread_mdelay(600);
  }
}
2.测试

按键一次,rt_sem_release(&keyPress1_sem);执行一次信号量值value加1。按键可以很快,但rt_thread3_entry()执行以下需要1s多。

rt_kprintf("t3 take a static semaphore");
rt_pin_write(LED3_PIN, PIN_HIGH);
rt_thread_mdelay(1000);
rt_pin_write(LED3_PIN, PIN_LOW);

即生产过快,消耗过慢。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023 IoTDB Summit:北京城建智控科技股份有限公司高级研发主管刘喆《IoTDB在城市轨道交通综合监控系统中的应用》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

CRM是什么软件?

阅读本文&#xff0c;你将了解&#xff1a;一、CRM是什么软件&#xff1b;二、CRM软件如何进行客户管理&#xff1b;三、CRM软件有什么价值&#xff1b;四、优秀案例分享。 一、CRM是什么软件 CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&…

用pandas实现用前一行的excel的值填充后一行

今天接到一份数据需要分析&#xff0c;数据在一个excel文件里&#xff0c;内容大概形式如下&#xff1a; 后面空的格子里的值就是默认是前面的非空的值&#xff0c;由于数据分析的需要需要对重复的数据进行去重&#xff0c;去重就需要把控的cell的值补上&#xff0c;然后根据几…

最佳 C++ 编译器

我喜欢 C&#xff0c;这已经不是什么秘密。我偏爱 C 的一个原因是&#xff0c;C 是一个“开放”的编程语言&#xff0c;任何人都可以使用自己喜欢的编译器。当然&#xff0c;C 编译器的种类也很多。同样&#xff0c; C IDE 也不少&#xff0c;我在之前的一个博客中讨论过这个话…

深度了解六西格玛培训:用MINITAB软件优化数据处理和项目管理——张驰咨询

在追求卓越的道路上&#xff0c;六西格玛培训不仅是一种管理哲学&#xff0c;更是一套科学精细的工具箱。它起源于摩托罗拉的制造车间&#xff0c;但如今它的精粹已经应用到各个行业&#xff0c;无论规模大小&#xff0c;都在追求完美的产品和服务质量。 在张驰咨询&#xff0…

SwiftUI 纯手工打造 100% 可定制的导航栏

功能需求 何曾几时,我们是否也厌倦了 SwiftUI 界面中刻板守旧的导航栏外观,而想要自己动手充分展示灵动炸裂的创造力呢? 如上图所示:我们在 SwiftUI 中通过纯手工打造了一款 100 在本篇博文中,您将学到以下内容 功能需求1. 导航栏基本结构2. 如何感知当前发生用户拖拽行为…

Unity SRP 管线【第五讲:URP烘培光照】

本节&#xff0c;我们将跟随数据流向讲解UEP管线中的烘培光照。 文章目录 一、URP烘培光照1. 搭建场景2. 烘培光照参数设置MixedLight光照设置&#xff1a;直观感受 Lightmapping Settings参数设置&#xff1a; 3. 我们如何记录次表面光源颜色首先我们提取出相关URP代码&#…

ctfshow-反序列化(web267-web270)

目录 web267 web268 web269 web270 总结 web267 页面用的什么框架不知道 看源码看一下 框架就是一种软件工具&#xff0c;它提供了一些基础功能和规范&#xff0c;可以帮助开发者更快地构建应用程序。比如Yii框架和ThinkPHP框架就是两个流行的PHP框架&#xff0c;它们提供…

基于Java SSM框架实现共享充电宝管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现共享充电宝管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于共享充电宝管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带…

开年安全锦囊|保护现代Web应用程序的 7 大关键举措

Web 应用和 API 已成为构建业务关键型应用程序的首选工具&#xff0c;而这些应用程序不但面临着多云环境、新兴架构等带来的复杂性&#xff0c;也受到愈加严峻的暴力破解、信息泄露、会话劫持、跨站脚本、注入攻击等安全挑战。 现代 Web 应用程序防护七大关键 对于安全专业人员…

SpringSecurity(11)——核心组件和认证流程

获取用户信息 // 获取安全上下文对象&#xff0c;就是那个保存在 ThreadLocal 里面的安全上下文对象 // 总是不为null(如果不存在&#xff0c;则创建一个authentication属性为null的empty安全上下文对象) SecurityContext securityContext SecurityContextHolder.getContext(…

免费的WordPress插件大全

在当今数字化的时代&#xff0c;拥有一个强大的在线存在变得至关重要。而对于使用WordPress建站的用户来说&#xff0c;插件是提高网站功能的关键。在这篇文章中&#xff0c;我们将为您推荐三款免费的WordPress插件&#xff0c;它们不仅是147SEO软件中的佼佼者&#xff0c;而且…

makefile的机制,执行命令的流程分析

makefile的机制&#xff0c;流程分析 calc:add.o sub.o multi.ogcc add.o sub.o multi.o calc.cpp -o calcadd.o:add.cppgcc -c add.cpp -o add.osub.o:sub.cppgcc -c sub.cpp -o sub.omulti.o:multi.cppgcc -c multi.cpp -o multi.oclean:rm -rf *.o calc按照这个例子分析&am…

Flash读取数据库中的数据

Flash读取数据库中的数据 要读取数据库的记录&#xff0c;首先需要建立一个数据库&#xff0c;并输入一些数据。数据库建立完毕后&#xff0c;由Flash向ASP提交请求&#xff0c;ASP根据请求对数据库进行操作后将结果返回给Flash&#xff0c;Flash以某种方式把结果显示出来。 …

Spring | Srping AOP (AOP简介、动态代理、基于“代理类”的AOP实现)

目录: 1.Spring AOP简介1.1 AOP简介1.2 AOP术语 2.动态代理2.1 JDK动态代理2.2 CGLIB代理 3.基于“代理类”的AOP实现3.1 Spring的通知类型3.2 ProxyFactoryBean ( 可通知.xml配置文件完成aop功能 ) 1.Spring AOP简介 1.1 AOP简介 Spring的AOP模块&#xff0c;是Spring框架体系…

nginx基于IP的多虚拟主机

结合这篇文章一起&#xff1a;nginx虚拟主机-CSDN博客文章浏览阅读63次。虚拟主机指的就是一个独立的站点配置&#xff0c;是nginx默认支持的一个功能&#xff0c;它能够有自己独立的域名&#xff0c;独立的ip&#xff0c;独立的端口配置&#xff0c;能够配置完整的www服务&…

<信息安全>《2 国内主要企业网络安全公司概览(二)》

4 北京天融信科技有限公司(简称天融信) 信息内容LOGO成立日期创始于1995年总部北京市海淀区上地东路1号院3号楼北侧301室背景民营企业是否上市天融信[002212]A股市值99亿主要产品网络安全大数据云服务员工规模6000多人简介天融信科技集团&#xff08;证券代码&#xff1a;0022…

基于内容的图像web检索系统

题目&#xff1a;基于内容的图像在线检索系统 简介&#xff1a;基于内容的图像在线检索系统&#xff08;Content Based Online Image Retrieval , 以下简称 CBOIR&#xff09;&#xff0c;是计算机视觉领域中关注大规模数字图像内容检索的研究分支。典型的CBOIR系统&#xff…

使用Python对音频进行特征提取

在几年前写的使用Python对音频进行特征提取使用的是人为特征的方法进行特征提取的&#xff0c;近些年随着深度学习的普及&#xff0c;这里尝试使用深度学习方法进行特征提取。 数据集测试 之前的数据集找不到了&#xff0c;这个数据其实是kaggle的一个数据&#xff1a;www.ka…

ElasticSearch集群灾难:别放弃,也许能再抢救一下 | 京东云技术团队

1 前言 Elasticsearch作为一个分布式搜索引擎&#xff0c;自身是高可用的&#xff1b;但也架不住一些特殊情况的发生&#xff0c;如&#xff1a; 集群超过半数的master节点丢失&#xff0c;ES的节点无法形成一个集群&#xff0c;进而导致集群不可用&#xff1b; 索引shard的文…