文档章节

LiteOS-内核C代码-屏幕输出

梦想游戏人
 梦想游戏人
发布于 2017/05/14 22:14
字数 405
阅读 129
收藏 1

终于可以开始用C来写代码了

内核启动代码,

#include "src/main.h"

const   char *VGA_BUFFER = (const char*)0x000b8000;// vga 显存开始地址

int kernel_entry()
{
	while (1)
	{
		main();
	}
	return 0;
}

main.c

#include "stdio.h"
#include "def.h"

void print_logo()
{
	printf("LiteOS 1.0 (c) 2013-2017 dreamyouxi.com\n\n");
	printf("*     *  *****  *****  \n");
	printf("*          *    *         \n");
	printf("*     *    *    *****  \n");
	printf("*     *    *    *         \n");
	printf("****  *    *    *****   OS 1.0 \n");
}

int main()
{
	print_logo();


	flush();


	while (1)
	{

	}
	return 0;
}

由于没有标准库,因此printf等这些标准库函数都要自己实现

VGA 13h显示模式下的显存首地址为0x0b8000 因此在这里面写数据即可

该模式下的屏幕是80(长度x)*25(高度y)*2字节,2字节为 char + 颜色(16色)

下面是颜色代码:(如 color fc 为亮白色产生亮红色,第一个背景,第二个前景)
    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 湖蓝色     B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色

0x0f就是黑背景,亮白色的数据 ,VGA还有其他显示模式,在此不展开

 

stdio.c,实现printf

void printf(const char*str)
{
	current_std_out_offset += strcpy((void*)(STD_OUT + current_std_out_offset), (void*)str);
}

void flush()
{
	cmd_cls();//clear
	unsigned int i = 0, ii = 0;
	char* out = VGA_BUFFER;
	out = VGA_BUFFER;
	char* out_buffer = (char*)STD_OUT;
	for (i = 0, ii = 0; '\0' != out_buffer[ii] && ii < VGA_BUFFER_MAX_OFFSET; ii++)
	{// left-up is (0,0);
		if (out_buffer[ii] == '\n')
		{
			i = (i / (VGA_X_BUFFER_SIZE)+1) * VGA_X_BUFFER_SIZE;
			continue;
		}
		out[i++] = out_buffer[ii];
		out[i++] = 0x0f;

	}
	current_std_out_offset = 0;
}

基本思想是通过标准函数来输出,然后实现这些标准函数,这些标准函数以后可以提供给可执行代码,

 

生成后vm运行

 

实模式下的内存地址范围

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 36
博文 429
码字总数 122400
作品 0
成都
物联网操作系统华为超轻量LiteOS解读

物联网终端设备开发遇到瓶颈 物联网经过这些年的发展,在终端设备开发中显现出诸多问题。 1、终端设备需要低成本、低功耗。由于多为小型便携产品,因而电池寿命和硬件成本就成了关键问题,降...

linuxCool
09/29
0
0
解码超轻量的华为LiteOS:为什么IoT需要专门的OS?

IoT设备真的需要OS吗?这是个问题。 物联网(IoT)作为拥有千亿级设备连接量的庞大市场,已经远超PC和移动手机市场体量。国内巨头在物联网平台已然较量了多个回合,而在此过程中,操作系统也...

王金旺
09/01
0
0
Contiki、TinyOS、LiteOS、Nano-RK、t-Kernel的操作系统性能和利弊

来至SICS的权威比较分析报告。 报告中比较了Contiki、TinyOS、LiteOS、Nano-RK、t-Kernel的操作系统性能和利弊,对于广大的物联网研究者和应用开发者不无裨益。 http://www.smeshlink.com/a...

龙鸟
2012/09/22
0
0
物联网将呈爆发式发展,华为OceanConnect物联网平台连接海量设备

前不久全球5G标准的确立,对物联网产业来说是极大的推动力。经过前几年的技术发展,NB-IoT、eLTE、LoRa等市场相继启动。预计2020年,物联网连接数将到达300亿;2025年将达到近1000亿。其中,...

云科技时代
06/28
0
0
Chino 操作系统开发日志 (1) - 为 IoT 而生

引言 很多人都听说过 IoT (物联网)这个词,越来越多的人在装修时开始选择智能家居,很多人也购买智能音箱做智能家居控制,想必未来一定是 AI + 物联网的时代。 一种技术要发展并走向成熟必...

SunnyCase
08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

HashTable

Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射 Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口 Hashtable 的函数都是同步的,这意味着它是线...

职业搬砖20年
30分钟前
1
0
Linux系统状态查看命令1

10月23日任务 10.1 使用w查看系统负载 10.2 vmstat命令 10.3 top命令 10.4 sar命令 10.5 nload命令 查看系统负载 w命令 # 第一行:当前系统时间,系统启动时间,登录的用户,系统负载:1分钟...

robertt15
45分钟前
3
0
缓存那些事

前言 一般而言,现在互联网应用(网站或App)的整体流程,可以概括如图1所示,用户请求从界面(浏览器或App界面)到网络转发、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容...

Skqing
54分钟前
2
0
nginx开启stub_status模块配置方法

nginx开启stub_status模块配置方法 2017年12月13日 15:57:29 ly_dengle 阅读数:3765 标签: stub_statusnginxnginx开启stub_status模块 更多 个人分类: 软件工具php 版权声明:本文为博主原...

linjin200
今天
3
0
挑逗 Java 程序员的那些 Scala 绝技

有个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言;而另外一些 Java 开发者却对它望而却步,认为它过于复杂而难以理解。同样是 ...

joymufeng
今天
184
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部