HNU-嵌入式系统-实验二

(我选的是1级实验“交通红黄绿灯”)
工程文件自取(点击跳转)

一、实验目标

基于STC-B开发板,尝试、体验并实现一个极简嵌入式操作系统及其应用。

二、实验内容

在这里插入图片描述

三、具体实现

(一)0级实验:

在这里插入图片描述

答:
(1) 资源竞争:当多个任务共享资源(如全局变量)时,如果没有适当的同步机制,它们可能会同时访问和修改资源,导致数据不一致或竞态条件。
(2) 死锁:如果任务在等待对方释放资源而自己又持有对方需要的资源,它们可能会陷入死锁状态,即它们都在等待对方,导致系统停止响应。
(3) 优先级反转:在优先级调度系统中,如果一个高优先级任务被低优先级任务阻塞,而低优先级任务又在等待中等优先级任务释放资源,这可能导致高优先级任务无法及时执行,影响系统性能。
(4) 任务饥饿:如果任务调度不当,某些低优先级任务可能会长时间得不到执行,导致任务饥饿。

(二)1级实验

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.我的“红黄绿灯”功能逻辑(车子视角)

(1)红黄绿灯模拟:数码管显示倒计时,总共8位数码管,最左边两位为“红灯”倒计时,中间两位为“黄灯”倒计时,最右边两位为“绿灯”倒计时;Led灯(总共8位),最左边两位点亮表示此时为红灯,中间两位点亮表示此时为黄灯(且闪烁),最右边两位点亮表示此时为绿灯。
(2)紧急情况(如紧急行人要经过):若此时为绿灯且还有较长时间(车子视角),则可按下一个按钮(key1模拟)直接变黄灯闪烁3秒后,让行人可以过马路。
(3)可以切换适合行人较多拥挤的时候,此时需要尽可能让行人通过的时间变得更长:交警可以按下一个按钮(key2模拟),让红灯时间增加,绿灯通行时间减少
(4)半夜工作模式:若到了半夜时,基本上没什么行人,此时应自动调整为“只有黄灯闪烁”模式。

2.熟悉RTX51 Tiny操作系统并掌握如何运用

(1)进程与事件

在这里插入图片描述

进程任务函数后面 + task 任务号(上图定义)

在这里插入图片描述
在这里插入图片描述

用16位比特的数据来记录事件,从低位到高位依此代表某个事件,如0101代表事件1和事件3已经发生了,说白了,event就是记录一个状态,哪些事件发生了,就记录一下。
在这里插入图片描述
在这里插入图片描述

我们可以自己写一下进程(如按键进程,按下某个按键就执行什么功能)
如:
在这里插入图片描述

(2)1s事件实现

我们没有用定时器,在函数里怎么实现的1s事件
答:用cnt变量记录,cnt++代表经过了1ms,而函数里有个while循环,循环一次cnt++(代表循环一次的时间就是1ms的时间),这个怎么实现这么精准? 用os_wait(K_IVL, 1, 0); os_wait(K_IVL, 1, 0) 是一个用于任务调度和延时的函数,具体的功能取决于你所使用的操作系统的实现。一般来说,这个函数的主要作用是 让当前任务暂停执行一段时间,以允许其他任务有机会运行。 当os_wait(K_IVL, 1, 0)调用完成后,如果已经等待了指定的时间(在这里是1毫秒),系统将唤醒该进程,允许它继续执行。
在这里插入图片描述

(3)外部中断

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

为什么两个按键状态检测分开写到两个外部中断里
最佳实践是在每个中断服务例程中专注于一个特定的任务。你可以在外部中断0和中断1中分别处理各自的
按键事件。这样可以保持逻辑清晰,并提高系统的响应速度。

3. 具体实现

(1) 红绿灯倒计时切换

构造一个实现“红黄绿切换且倒计时”的任务(进程),首先#define三个常量RED,YELLOW,GREEN(表示红、黄、绿灯对应总时间大小)
在这里插入图片描述

每一秒钟改变对应数码管显示时间,使其减一:
在这里插入图片描述

代码逻辑实现如下:
在这里插入图片描述

(2)紧急行人路过

可按下一个按钮(key1模拟)直接变黄灯闪烁3秒后,让行人可以过马路,具体代码实现则是调用等待事件函数,等待EVENT_KEY1_PRESS事件,后面再使green时间片置为0,使其直接进入黄灯时间片。具体代码如下:
在这里插入图片描述

(3)行人较多,拥挤时刻

可以切换适合行人较多拥挤的时候,此时需要尽可能让行人通过的时间变得更长:交警可以按下一个按钮(key2模拟),让红灯时间增加,绿灯通行时间减少
可定义一个全局变量mode,若为0则为正常模式,为1则为行人较多策略,使其对应的红灯总时间增加、绿灯时间减少。具体代码如下:
在这里插入图片描述

(4)半夜

若到了半夜时,基本上没什么行人,此时应自动调整为“只有黄灯闪烁”模式。我们使用光敏电阻,运用ADC检测光照强度,若数模转换后的电压低于某个阈值,就进入半夜模式,使其只有黄灯闪烁。
首先对ADC初始化:
在这里插入图片描述

在1ms进程里进行ADC采样并检测,若符合“半夜”,则将EVENT_MIDNIGHT事件加入到events事件里面。代码如下:
在这里插入图片描述

构建一个半夜进程:若等到有EVENT_MIDNIGHT事件时,就实现黄灯闪烁,具体代码如下:
在这里插入图片描述

四、效果展示

这里不好展示视频,只展示正常模式下与半夜时的模式的图片。

1.正常模式:

在这里插入图片描述

2.半夜:

在这里插入图片描述

包含代码和文档 实验实验内容 编写程序,演示多进程并发执行和进程软中断、管道通信。 父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2; 子进程1每隔1秒通过管道向子进程2发送数据: I send you x times. (x初值为1,每次发送后做加一操作) 子进程2从管道读出信息,并显示在屏幕上。 父进程用系统调用signal()捕捉来自键盘的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Process l is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,释放管道并输出如下的信息后终止 Parent Process is Killed! 实验 实验内容 过Linux多线程与信号灯机制,设计并实现计算机线程与I/O线程共享缓冲区的同步与通信。 程序要求:两个线程,共享公共变量a 线程1负责计算(1到100的累加,每次加一个数) 线程2负责打印(输出累加的中间结果) 实验实验内容 利用多个共享内存(有限空间)构成的环形缓冲,将源文件复制到目标文件,实现两个进程的誊抄。 实验实验内容 1、(1)Blink程序的编译和下载 (2)给Blink程序加入printf,在每次定时器事件触发点亮LED的同时通过串口显示信息 (3)修改BLink程序,只使用一个Timer,三个LED灯作为3位的进制数表示(亮灯为1,不亮为0),按照0-7的顺序循环显示,同时将数值显示在终端上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值