最新要闻
- 天天最资讯丨有信免费电话使用攻略_有信怎么使用 免费
- 七夕 我们分手
- 微资讯!自带散热泵!一加推出45W液冷散热背夹:最高可降20℃
- 倒计时两分钟!SpaceX载人火箭发射最后关头被紧急叫停
- 世界资讯:七彩虹战戟CN700 1TB SSD评测:国产方案7.1GB/s读取、499元最香
- GTX 750 Ti挑战大热单机:画面不忍直视
- 【热闻】“狗”气越来越足!第二代哈弗大狗正式上市:13.58万元起
- 最新消息:不怕被坑了!工信部出手:自动续费前5日应以显著方式提醒
- 1999元 极米Play 2投影仪上架:120寸大屏、Type-C供电
- 【世界时快讯】3D大颗粒 杰士邦特惠装30支:19.9元秒杀
- 异形方向盘有隐患吗?汽车博主:既不方便也不安全
- 全球微头条丨照坏了手机的激光雷达:会照瞎你的眼吗?
- 全球第一大癌!39岁女儿与67岁父亲先后确诊乳腺癌
- 世界微速讯:电动自行车电池容量正常但里程不足?5招教你解决
- 环球讯息:延迟骤降50%:魅族20系列首发游戏模式6.0
- 热文:秒独显的3GHz高频缩水 AMD锐龙7000HS上市前又挨一刀
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
今亮点!0x07_自制操作系统My-OS实现键盘输出字符到屏幕
接上一课class04,这是他的运行结果
收到了键盘的中断,现在想的当然是怎么把输入的文字显示到屏幕上,做成一个最简单的IO
(资料图)
这是class04的目录结构,现在我们把他换成class05
我们现在要读取键盘的数据,然后显示在屏幕上面
interrupt.c
#include "include/head.h"void inthandler21(int *esp)/* 来自PS/2键盘的中断 */{ unsigned char data,s[256]; io_set8(PIC0_OCW2, 0x61); /* 通知PIC,说IRQ-01的受理已经完成 */ data = io_get8(PORT_KEYDAT); struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; boxfill8(binfo->vram, binfo->scrnx, 0,0,0,binfo->scrnx, binfo->scrny); sprintf(s, "key = %d", data); putfonts8_asc(binfo->vram, binfo->scrnx, 8, 8, 7, s); return;}
直接修改中断函数里面的代码即可,主要就是获取data然后输出
head.h
/*interrupt.c*/#define PORT_KEYDAT 0x0060
这个是数据的地址,你要修改一下head.h,刚刚的那个函数要用的
运行:
cd class05..\z_tools\make.exe run
如果你发现你的键盘按一下就没用了可能是现在的键盘有点新,你可以把大写锁定打开,如果你不想这么麻烦,你可以自己买老键盘,最好2010之前的也可以买罗技k120这个型号的我就是这个试着没问题
还有我把main.c的输出那几句删了避免显示重叠
今天还没完呢,我还得讲一下fifo,first in first out,这个东西是用来缓存数据的,我刚刚给你们的键盘输入是不是还行,但是这个有个问题就是你按键盘的时候pic完全为键盘+屏幕输出服务,比如你用pic搞计时器,计时器会受影响,屏幕输出要花时间的pic等不起,或许你看不出来但是这对pic影响很大,所以我们要先把数据保存下来然后慢慢的输出,这时候pic就只负责保存数据到内存,不要显示。
fifo.c
#include "include/head.h"void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf){ fifo->size = size; fifo->buf = buf; fifo->free = size; fifo->flags = 0; fifo->p = 0; fifo->q = 0; return;}int fifo8_put(struct FIFO8 *fifo, unsigned char data){ if (fifo->free == 0) { fifo->flags |= FLAGS_OVERRUN; return -1; } fifo->buf[fifo->p] = data; fifo->p++; if (fifo->p == fifo->size) { fifo->p = 0; } fifo->free--; return 0;}int fifo8_get(struct FIFO8 *fifo){ int data; if (fifo->free == fifo->size) { return -1; } data = fifo->buf[fifo->q]; fifo->q++; if (fifo->q == fifo->size) { fifo->q = 0; } fifo->free++; return data;}int fifo8_status(struct FIFO8 *fifo){ return fifo->size - fifo->free;}
代码给你们直接用就是,我解释也解释不清,我乃cv工程师不需要知道原理
/*fifo.c*/struct FIFO8 { unsigned char *buf; int p, q, size, free, flags;};#define FLAGS_OVERRUN 0x0001void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf);int fifo8_put(struct FIFO8 *fifo, unsigned char data);int fifo8_get(struct FIFO8 *fifo);int fifo8_status(struct FIFO8 *fifo);
这个添加到head.h里面去都是fifo要用的
/*naskfunc.asm*/void io_stihlt();void io_hlt(void);void io_cli(void);void io_sti(void);int io_get8(int port);void io_set8(int port, int data);void write_mem8(int addr, int data);int io_load_eflags(void);void io_store_eflags(int eflags);void load_gdtr(int limit, int addr);void load_idtr(int limit, int addr);void asm_inthandler21(void);/* asmhead.nas */struct BOOTINFO { /* 0x0ff0-0x0fff */ char cyls; /* 启动区读磁盘读到此为止 */ char leds; /* 启动时键盘的LED的状态 */ char vmode; /* 显卡模式为多少位彩色 */ char reserve; short scrnx, scrny; /* 画面分辨率 */ char *vram;};#define ADR_BOOTINFO 0x00000ff0/*graphic.c*/void init_palette(void);void set_palette(int start, int end, unsigned char *rgb);void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1);void putfont8(char *vram, int xsize, int x, int y, char c, char *font);void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s);/*font*/extern char font[4096];/* dsctbl.c */struct SEGMENT_DESCRIPTOR { short limit_low, base_low; char base_mid, access_right; char limit_high, base_high;};struct GATE_DESCRIPTOR { short offset_low, selector; char dw_count, access_right; short offset_high;};void init_gdtidt(void);void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar);void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar);#define ADR_IDT 0x0026f800#define LIMIT_IDT 0x000007ff#define ADR_GDT 0x00270000#define LIMIT_GDT 0x0000ffff#define ADR_BOTPAK 0x00280000#define LIMIT_BOTPAK 0x0007ffff#define AR_DATA32_RW 0x4092#define AR_CODE32_ER 0x409a#define AR_INTGATE32 0x008e/* pic.c */void init_pic(void);#define PIC0_ICW1 0x0020#define PIC0_OCW2 0x0020#define PIC0_IMR 0x0021#define PIC0_ICW2 0x0021#define PIC0_ICW3 0x0021#define PIC0_ICW4 0x0021#define PIC1_ICW1 0x00a0#define PIC1_OCW2 0x00a0#define PIC1_IMR 0x00a1#define PIC1_ICW2 0x00a1#define PIC1_ICW3 0x00a1#define PIC1_ICW4 0x00a1/*interrupt.c*/#define PORT_KEYDAT 0x0060void inthandler21(int *esp);/*fifo.c*/struct FIFO8 { unsigned char *buf; int p, q, size, free, flags;};#define FLAGS_OVERRUN 0x0001void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf);int fifo8_put(struct FIFO8 *fifo, unsigned char data);int fifo8_get(struct FIFO8 *fifo);int fifo8_status(struct FIFO8 *fifo);
加粗你懂吧,都是新加的,上面单独这句也要,之前说了,是键盘接收数据的地址
修改interrupt.c
#include "include/head.h"struct FIFO8 keyfifo;void inthandler21(int *esp)/* 来自PS/2键盘的中断 */{ unsigned char data; io_set8(PIC0_OCW2, 0x61); /* 通知PIC,说IRQ-01的受理已经完成 */ data = io_get8(PORT_KEYDAT); fifo8_put(&keyfifo, data); return;}
就是保存数据了,fifo还要初始化,我们在main里面初始化,在main的死循环里面读取
main.c
#include "include/head.h"#includestruct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;extern struct FIFO8 keyfifo;void Main(void){ int i;char s[256]; char keybuf[256];init_gdtidt(); init_pic(); io_sti(); fifo8_init(&keyfifo, 32, keybuf);init_palette(); io_set8(PIC0_IMR, 0xf9); /* 开放PIC1和键盘中断(11111001) */ for (;;) { io_hlt(); if (fifo8_status(&keyfifo)== 0) { io_stihlt(); } else { int i = fifo8_get(&keyfifo); io_sti(); if(i<129) { boxfill8(binfo->vram, binfo->scrnx, 0,0,0,binfo->scrnx, binfo->scrny); sprintf(s, "key = %d", i); putfonts8_asc(binfo->vram, binfo->scrnx, 8, 8, 7, s); }else{ boxfill8(binfo->vram, binfo->scrnx, 0,0,0,binfo->scrnx, binfo->scrny); sprintf(s, "key = -"); putfonts8_asc(binfo->vram, binfo->scrnx, 8, 8, 7, s); } }}}
加粗懂我意思吧,最后修改Makefile就可以编译运行了
运行:
cd class05..\z_tools\make.exe run自制操作系统合集原文地址:https://www.cnblogs.com/Frank-dev-blog/category/2249116.html项目github地址rick521/My-OS (github.com)给我点颗star
今亮点!0x07_自制操作系统My-OS实现键盘输出字符到屏幕
当前热议!Python中logging模块用法
世界滚动:C语言程序设计
天天最资讯丨有信免费电话使用攻略_有信怎么使用 免费
七夕 我们分手
微资讯!自带散热泵!一加推出45W液冷散热背夹:最高可降20℃
倒计时两分钟!SpaceX载人火箭发射最后关头被紧急叫停
世界资讯:七彩虹战戟CN700 1TB SSD评测:国产方案7.1GB/s读取、499元最香
GTX 750 Ti挑战大热单机:画面不忍直视
【热闻】“狗”气越来越足!第二代哈弗大狗正式上市:13.58万元起
【天天新视野】关于Ajax
路飞项目封装logger、response以及全局异常
最新消息:不怕被坑了!工信部出手:自动续费前5日应以显著方式提醒
1999元 极米Play 2投影仪上架:120寸大屏、Type-C供电
【世界时快讯】3D大颗粒 杰士邦特惠装30支:19.9元秒杀
异形方向盘有隐患吗?汽车博主:既不方便也不安全
从银行数字化转型来聊一聊,火山引擎 VeDI 旗下 ByteHouse 的应用场景
今日热讯:第123篇: JS函数属性与方法
Prometheus配置Alertmanager(钉钉告警)
全球微头条丨照坏了手机的激光雷达:会照瞎你的眼吗?
全球第一大癌!39岁女儿与67岁父亲先后确诊乳腺癌
世界微速讯:电动自行车电池容量正常但里程不足?5招教你解决
环球讯息:延迟骤降50%:魅族20系列首发游戏模式6.0
热文:秒独显的3GHz高频缩水 AMD锐龙7000HS上市前又挨一刀
房贷60万20年和30年利息差多少?两种还款方式利息对比
当前视点!WHAT IS PPM Encoder ?
焦点速递!记录--关于无感刷新Token,我是这样子做的
热点!如何使用appuploader制作apple证书
世界热资讯!JMeter的基础认识
【环球热闻】3月1日广东男篮主场见 威姆斯晒登机照:回家
【天天报资讯】Redis 缓存过期策略和内存淘汰策略
环球热头条丨【复盘】搭建日志平台的复盘与思考
天天微动态丨sed命令的使用(替换)
环球实时:软件工程阅读笔记
Android ADB 备忘清单_开发速查表分享
焦点资讯:美国高中地下发现加密货币矿场 7个月耗电费12万元
直屏手机为何越来越多了?原因有三个
新资讯:近250家公司用ChatGPT取代员工:过半考核优秀 能省10万美元
环球滚动:诺基亚60年首次更换Logo后:手机品牌继续沿用经典蓝底Logo
环球快报:比老司机还稳!特斯拉主动安全压线避让变道前车:车主惊叹
天天头条:三睾拟双身虫
Prometheus插件安装(mysql_exporter)
消息!河南农信社数字化转型实践方案
今日讯!剑指 Offer 55 - I. 二叉树的深度(java解题)
世界新动态:八代将军吉宗下载_八代将军吉宗
女子驾奇瑞小蚂蚁 高速上油门到底车速为0!4S店:退款退车
世界速看:暴雪联合时尚品牌推出《暗黑4》主题女装:这画风太诡异了
焦点播报:董明珠:格力员工一人一套房承诺不变
个人私生活被恶搞辣眼?董明珠:有些自媒体为了赚钱不择手段 低级下流无聊
一文看懂小米无线AR眼镜探索版:自研微手势 隔空就能刷抖音
数据结构刷题2023.02.27小记
天天即时看!Ubuntu-深度学习环境搭建(yolov3)
焦点滚动:学习swoole之前,你需要知道的几件事
世界看热讯:流氓APP再见!26条新规严管移动应用:不得欺骗误导用户
Win11 22H2“Moment 2”更新快了:将在未来几周推送
每日讯息!男子醉驾被查也不让新手妻子开车:为了不要出现更大的事故
【全球新要闻】为迎接中国游客!韩国旅游业也是拼了:推中文菜单、背汉语、招募中文职员
手一抖被迫看广告!工信部通知:禁止高灵敏度“摇一摇”
当前资讯!宜兴购房补贴本科生可以申请吗?
焦点关注:ChatGPT的隐私安全问题及隐私保护技术
无关风月是什么意思?无关风月我题序等你回是什么歌?
小盆友是什么意思?小盆友生日祝福成语有哪些?
这款MOD可以让《原子之心》双子舞伶露脸:好看吗?
天天播报:中兴发布小方糖路由器:双千兆设计 首发99元
考验信仰、财力的时候到了!丰田加价神车新一代埃尔法曝光
13代酷睿CPU热卖 Intel承诺员工薪酬会涨回来:基本工资100%满血
每日消息!形似比亚迪仰望U8 奇瑞捷途旅行者官图发布:保时捷前总监操刀
电视剧红狐荣乡君是什么人?红狐电视剧演员表介绍
刻在我心底的名字是哪部电影的主题曲?刻在我心底的名字歌词是什么?
win7快速启动栏在哪里?win7快速启动栏怎么使用?
东芝ac100怎样刷系统?东芝ac100安卓笔记本多少钱?
超长待机智能手机有哪些?超长待机智能手机排行榜
三星GALAXY i5700什么时候上市的?三星GALAXY i5700怎么关机?
世界热头条丨谷歌邮箱注册
环球观察:Prometheus插件安装(NodeExporter)
焦点热讯:Redis高频面试题总结
速读:财政部:截至1月末,全国地方政府债务余额357018亿元
聚焦:威马员工在线讨薪 吉利副总裁:我这里缺人、可以考虑下
全球看点:一箱油续航轻松破千公里 五菱凯捷混动铂金版上市:12.98万起
摩托罗拉rizr纵向卷轴屏手机亮相:屏幕可伸长
国内能买到!ZERO SR-X概念电动摩托发布:110马力、能跑300公里
当前关注:送冰极洁面霜:妮维雅男士控油补水洗面奶24.9元大促
天天热推荐:Mysql 自定义目录安装
世界资讯:武汉Java培训班哪家好?大家都要怎么挑选
全球速看:SQL行转列、列转行(SQL Server版)
世界视点!南京Java培训班哪家好,什么样的可选
什么是潮吹
担心的事儿发生了:已有企业在用ChatGPT取代员工
每日热门:iPhone 15 Pro Max与14 Pro Max对比:明显更厚了!妥妥半斤机
纳智捷当街加油 车主现身说法:从郑州到广州加了5次
环球速递!半价大促:五芳斋豆沙青团6枚9.9元发车 清甜绵软
全球最早上映!任天堂《超级马力欧兄弟》大电影内地定档4月5日
世界最新:总结SpringBoot1.x迁移到2.x需要注意的问题
全球短讯!Spring Boot 实现日志链路追踪,无需引入组件,让日志定位更方便!
代理设计模式还不会?2分钟搞定
【世界报资讯】河南省通许县:“中国酸辣粉之都”正式揭牌
天天热门:微信下重拳:上万个群被封杀 此类行为千万别做
环球微头条丨程序员20年喝近2吨可乐屡患结石 几乎天天喝
联想推ThinkPad Z16 Gen 2笔记本:锐龙7000系列 可选4K+屏
双子姐妹、冰箱很带感 《原子之心》游戏已被破解:俄罗斯自己黑客干的