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

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.mzph.cn/news/639609.shtml

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

相关文章

【Spring 篇】MyBatis多表操作:编织数据的交响乐

欢迎来到MyBatis的多表操作世界&#xff01;在这个充满交响乐的舞台上&#xff0c;我们将探索如何巧妙地编织多个数据表的数据&#xff0c;创造出一场旋律动听的数据交响曲。无需繁琐的SQL拼接&#xff0c;MyBatis让多表操作变得优雅而简单。让我们一起进入这个音乐殿堂&#x…

司铭宇老师:房地产电话营销培训:房地产电话销售话术与销售技巧:打造高转化率的电话营销策略

房地产电话营销培训&#xff1a;房地产电话销售话术与销售技巧&#xff1a;打造高转化率的电话营销策略 在房地产销售中&#xff0c;电话销售是一种常见且有效的营销手段。它不仅可以快速触达潜在客户&#xff0c;还能够建立起销售人员与客户之间的初步信任关系。然而&#xff…

大模型学习之书生·浦语大模型6——基于OpenCompass大模型评测

基于OpenCompass大模型评测 关于评测的三个问题Why/What/How Why What 有许多任务评测&#xff0c;包括垂直领域 How 包含客观评测和主观评测&#xff0c;其中主观评测分人工和模型来评估。 提示词工程 主流评测框架 OpenCompass 能力框架 模型层能力层方法层工具层 支持丰富…

C++从小白到初级工程师【个人学习笔记】

目录 1.背景2.基础二维数组概念二维数组定义方式 二维数组数组名称概念例子 函数的分文件编写概念示例 指针指针的基本概念指针变量的定义和使用 空指针和野指针空指针实例野指针实例 const修饰指针概念const修饰指针 --- 常量指针 指针和数组作用示例 指针和函数作用示例 指针…

项目解决方案:某城区(区县)社会面视频监控资源接入汇聚解决方案

目 录 一、概述 二、建设目标及需求 1.建设目标 2.需求分析 2.1 总体需求 2.2 需求细化 三、方案设计 1.设计依据 2.设计原则 3.设计方案 3.1.方案描述 3.2.组网说明 四、产品介绍 1.视频监控综合资源管理平台介绍 2.视频录像服务器和存储 2.1…

python算法与数据结构(搜索算法和拓扑排序算法)---深度优先搜索

课程目标 了解树/图的深度遍历&#xff0c;宽度遍历基本原理&#xff1b;会使用python语言编写深度遍历&#xff0c;广度遍历代码&#xff1b;掌握拓扑排序算法 搜索算法的意义和作用 搜索引擎 提到搜索两个子&#xff0c;大家都应该会想到搜索引擎&#xff0c;搜索引擎的基…

网络安全(初版,以后会不断更新)

1.网络安全常识及术语 资产 任何对组织业务具有价值的信息资产&#xff0c;包括计算机硬件、通信设施、IT 环境、数据库、软件、文档 资料、信息服务和人员等。 漏洞 上边提到的“永恒之蓝”就是windows系统的漏洞 漏洞又被称为脆弱性或弱点&#xff08;Weakness&#xff09;&a…

DC-7靶机做题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1w2c_QKd_hOoR2AzNrdZjMg?pwdtdky 提取码&#xff1a;tdky 参考&#xff1a; DC7靶机地址&#xff1a;http://www.five86.com/downloads/DC-7.zipDC7靶场介绍: https://www.vulnhub.com/entry/dc-7,356/…

AI+量化02_金融市场的基础概念

文章目录 问答之纯小白 vs GPT4Q1. 请用尽可能简短的语句或例子&#xff0c;给小白讲解宏观经济Q2. 给小白讲解资本边际效率Q3. 如果证券没有风险是否意味着没有收益&#xff1f;Q4. 芒格&#xff1a;教人炒股&#xff0c;犹如引人吸毒Q5. 给小白快速讲解&#xff1a;卡房统计量…

计算机速成课Crash Course - 21. 压缩

更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 21. 压缩 (qq.com) 今天继续计算机速成课Crash Course的系列讲解。 21. 压缩 上集我们讨论了文件格式&#xff0c;如何…

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

Docker(十一)Swarm mode

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Swarm mode Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎&#xff0c;成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm …

力扣509. 斐波那契数

动态规划 思路&#xff1a; 斐波那契数通式&#xff1a;F(n) F(n - 1) F(n - 2)&#xff1b;以此为状态转移方程&#xff0c;对其进行动态规划&#xff1b;边界条件&#xff1a; F(0) 0F(1) 1使用两个变量来存储上一组结果&#xff1b; class Solution { public:int fib(…

Docker安装配置OnlyOffice

OnlyOffice 是一款强大的办公套件&#xff0c;你可以通过 Docker 轻松安装和部署它。本文将指导你完成安装过程。 步骤 1&#xff1a;拉取 OnlyOffice Docker 镜像 首先&#xff0c;使用以下命令从 Docker Hub 拉取 OnlyOffice Document Server 镜像&#xff1a; sudo docke…

计算机毕业设计 基于MVC的自习室管理和预约系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

如何用数据赋能社媒营销决策?

在数字化时代&#xff0c;越来越多的商家开始意识到数据分析对于改善经营的重要性。 传统决策更多依赖过往经验、商业直觉、他人的思路模板等方法&#xff0c;或者依靠描述性统计、简单的数据分析。在数字时代&#xff0c;则通过精细化数据分析&#xff0c;做出更明智的营销决策…

LLM包含的知识

基础知识 磨刀不误砍柴工&#xff0c;LLM基础知识还是需要的。会按照历史梳理LM&#xff0c;详解BERT、GPT系列等各种预备核心知识点&#xff0c;并带着进行GPT预训练实战、位置编码&#xff08;长文本问题&#xff09;实战等。 数据工程 数据很重要&#xff0c;数据是天花板…

在docker中配置 Linux ls 配色方案 与 shell 提示符

发行版中默认的配置一般非常合理&#xff0c;但是docker中往往忽略了这些简单的配置&#xff0c;备忘一下 1. ls 配色方案 vim &#xff5e;/.bashrc 在文件最末尾加入如下一行内容&#xff1a; export LS_COLORS"rs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40…

基于供水管网建模的漏损控制

1.1供水管网模型的概念和管网建模目的 供水管网系统是比较特殊的城市基础设施&#xff0c;不可见且属于压力管道。随着运行年限的增长&#xff0c;管道的过水能力和水泵的运行工况都发生了变化&#xff0c;管道的改扩建也使管网系统的结构发生了变化&#xff0c;导致系统运行状…

WPF-HelixToolkit包的使用(上)

1、引入HelixToolkit包&#xff1a;新建一个WPF项目&#xff0c;在项目“引用”上右击&#xff0c;选择“管理NutGet程序包”&#xff0c; 2、在左侧“浏览”中输入“helixtoolkit” 3、安装第一个“HelixToolkit”包 4、解决错误&#xff1a;右击属性->应用程序->目标框…