LiteOS-内核C代码-屏幕输出
LiteOS-内核C代码-屏幕输出
梦想游戏人 发表于1年前
LiteOS-内核C代码-屏幕输出
  • 发表于 1年前
  • 阅读 113
  • 收藏 1
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

终于可以开始用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运行

 

实模式下的内存地址范围

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 34
博文 401
码字总数 115368
×
梦想游戏人
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: