信号

概念

在linux下执行以下 的命令,会出现如下的结果:

//以下显示的是系统定义的信号列表
@localhost ~]$ kill -l
 1) SIGHUP      2) SIGINT       3) SIGQUIT   
 6) SIGABRT     7) SIGBUS        8) SIGFPE   
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE 
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT
21) SIGTTIN     22) SIGTTOU     23) SIGURG  
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH        
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4

shell可以同时运行一个前台进程和多个后台进程,只有前台可以接收到控制键产生的信号:例Ctrl+c。

  • 前台运行过程中用户随时可能按下一个信号,该进程的用户空间代码执行到任何地方都有可能收到系统信号而终止,所以一信号相对于进程的控制流程来说是异步的。

    信号是如何产生的?

  • 用户在终端按下一些键的时候终端驱动环境就会发送信号给前台进程

  • 硬件异常,硬件检测到异常之后报告给内核,然后内核向当前进程发送适当的信号(例:除0异常,内存访问错误,段错误)
  • 一个进程进行了系统函数调用kill,raise,abort,会向进程发送信号。
  • 软件条件:管道的读端已经关闭,但是仍然写数据,就会产生SIGPIPE的信号。而闹钟超时也会产生一个SIGALRM的信号。

    处理方式

  • 忽略此信号

  • 进行该信号的默认行为:进程终止

  • 捕捉信号:要求提供一个信号处理函数,在内核处理这个信号的时候转到用户执行处理函数。
  • 附一个博主的博客链接,介绍的是捕捉信号的函数:https://blog.youkuaiyun.com/a1414345/article/details/71663379
  • pause函数的实例:https://www.cnblogs.com/yxk529188712/p/4982401.html
  • 如何实现信号的捕捉:出现异常后终端,系统调用进入到内核中;内核处理完异常准备返回用户状态之前,先处理当前进程中可以递送的信号(即实际处理信号的动作);自定义的信号处理函数回到用户状态执行函数;处理完之后在返回时执行特殊的系统调用再次进入内核;返回用户模式后,在上次中断的地方继续向下执行。

    信号的阻塞

    https://blog.youkuaiyun.com/stand__out/article/details/52039704

    volatile

  • 防止编译器对代码进行优化,举一个人简单的例子,在定义变量前加上volatile,说明这个被定义的变量的值是可变的。

include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
    volatile int i=10;//每次都直接从内存中读取,而不是寄存器
    int a=i;
    cout<<a<<endl;
    _asm
    {
        mov dword ptr [ebp-4],60
    }
    int b=i;
    cout<<b<<endl;
    getchar();
}

//正确结果为
10
60

竞态条件

  • 由于进程线程的切换,导致程序出现逻辑错误。

可重入函数

  • 两个不同的控制流程调用同一个函数,,访问时不会造成逻辑错乱。
资源下载链接为: https://pan.quark.cn/s/502b0f9d0e26 在进行STM32F103C8T6与HC - 06蓝牙模块、PC端以及ROS(机器人操作系统)的串口通信测试时,我们编写了以下程序。 硬件连接 将STM32F103C8T6的USART1的TX(PA9)引脚与HC - 06的RX引脚相连,同时将USART1的RX(PA10)引脚与HC - 06的TX引脚相连,以实现两者之间的串口通信。 另外,通过串口转USB模块(如CH340等)将STM32F103C8T6与PC端连接起来,方便在PC端进行通信数据的发送和接收。 程序功能 初始化USART1,设置波特率为9600,用于与HC - 06通信。同时,初始化USART2(连接串口转USB模块),波特率同样设置为9600,用于与PC端通信。 在主循环中,STM32F103C8T6不断检测USART1和USART2是否有数据接收。当从USART1(HC - 06)接收到数据时,将数据暂存到一个缓冲区中,然后通过USART2发送给PC端。反之,当从USART2(PC端)接收到数据时,也暂存到缓冲区,再通过USART1发送给HC - 06。这样就实现了STM32F103C8T6作为中间节点,将HC - 06与PC端的数据进行转发。 硬件连接 HC - 06蓝牙模块通过串口与STM32F103C8T6连接,如上所述。 程序功能(蓝牙通信部分) HC - 06在默认状态下会自动进入配对模式,等待与手机或其他蓝牙设备配对。当配对成功后,它会将从蓝牙设备接收到的数据通过串口发送给STM32F103C8T6。同时,它也会将STM32F103C8T6发送过来的数据转发给已配对的蓝牙设备。在本测试程序中,主要关注其与STM32F103C8T6之间的串口通信功能,确保数据能够正确地在两者之间传输。 硬件连接 通过串口
内容概要:本文详细介绍了一个基于两个单片机串行通信的电子密码锁项目。项目背景指出随着信息技术的发展,电子密码锁因其高可靠性、低成本等优势成为主流选择。项目采用主控和辅助两个单片机分别负责不同功能模块,并通过串行通信(如UART协议)实现数据交互。主控单片机处理密码输入验证、用户界面显示等,辅助单片机负责锁控制。系统还涉及多级安全防护、低功耗设计、友好的用户界面等特性。项目挑战包括确保通信稳定、提升密码验证安全性、优化电源管理和用户交互设计等。项目创新点在于双单片机协同工作、串行通信协议优化、多级安全防护以及低功耗设计。; 适合人群:对嵌入式系统开发有一定了解,特别是对单片机编程、串行通信协议、密码锁设计感兴趣的工程师或学生。; 使用场景及目标:①适用于家庭安防、商业办公、银行金融、智能酒店、医疗行业等需要高安全性的场所;②帮助开发者掌握双单片机协同工作的原理,提高系统的稳定性和安全性;③通过实际项目加深对串行通信协议的理解,掌握密码锁系统的软硬件设计方法。; 阅读建议:建议读者结合实际硬件设备进行实践操作,重点理解串行通信协议的设计与实现,同时关注密码验证的安全性设计和电源管理优化。此外,可以通过提供的代码示例加深对各功能模块的理解,并尝试修改和优化代码以适应不同的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值