LiteOS-内核C代码-屏幕输出
终于可以开始用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运行
实模式下的内存地址范围