文档章节

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

梦想游戏人
 梦想游戏人
发布于 2017/05/14 22:14
字数 405
阅读 133
收藏 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
博文 437
码字总数 124258
作品 0
成都
私信 提问
物联网操作系统华为超轻量LiteOS解读

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

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

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

王金旺
2018/09/01
0
0
有人用过LiteOS 么?

有人用过LiteOS 么?

李勇2
2016/11/24
1K
6
豌豆机器小组发布最新 WRTnode2R,支持华为 Liteos、QQ物联与AllJoyn

5月26日,WRTnode在官方微博简单地曝光了新产品——WRTnode2R开发板。它在继续使用OpenWrt的同时,还嵌入了华为刚发布不久的物联网操作系统Liteos,封装了QQ物联的部分功能,并支持AllJoyn协...

观海yangquan
2015/06/09
4.9K
3
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

没有更多内容

加载失败,请刷新页面

加载更多

百度黄埔学院将培养一批首席AI架构师,为“国之重器”赋能

深度学习高端人才不仅是AI发展的重要养分,也是企业转型AI巨大推动力。2019年1月19日,百度黄埔学院——深度学习架构师培养计划在百度科技园举行开学典礼,深度学习技术及应用国家工程实验室...

深度学习之桨
29分钟前
2
0
扒站wget仿站

wget -c -r -p -np -k http://xxx.com/xxx 其中: -c, --continue (断点续传) 接着下载没下载完的文件 -r, --recursive(递归) specify recursive download.(指定递归下载) -p, --page...

临江仙卜算子
32分钟前
2
0
Nextjs+React非页面组件SSR渲染

@随风溜达的向日葵 Nextjs Nextjs是React生态中非常受欢迎的SSR(server side render——服务端渲染)框架,只需要几个步骤就可以搭建一个支持SSR的工程(_Nextjs_的快速搭建见Next.js入门)...

随风溜达的向日葵
今天
0
0
如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
今天
3
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部