首页 Soft PlugIn RAN乱 Dev开发 Info资料 English WAP 留言 登陆 注册
-
Posted by Yippee | 评论(1) | 引用(0) | 阅读2736次
µC/OS-II UCOSII学习笔记1

今天开始正式学习µC/OS-II UC/OSII UCOS,乱七八糟的,反正就是这个东西吧。采用工具 SOURCE INSIGHT看源代码,BAIDU/GOOGLE搜索关键内容,310-μC/OS-II:实时操作系统内核 Packard Bell NEC, Inc. 一篇中文电子文档。我经验值为0。基本都是做WINDOWS程序,什么东西都不明白。

void main (void)
{
    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* Clear the screen                         */ 注释是说清屏

转到函数定义:

void PC_DispClrScr (INT8U color)
{
    INT8U  far *pscr;
    INT16U      i;

    pscr = (INT8U far *)MK_FP(DISP_BASE, 0x0000);
    for (i = 0; i < (DISP_MAX_X * DISP_MAX_Y); i++) { /* PC display has 80 columns and 25 lines        */
        *pscr++ = ' ';                                /* Put ' ' character in video RAM                */
        *pscr++ = color;                              /* Put video attribute in video RAM              */
    }
}

MK_FP函数的定义是:

函数名: MK_FP
功  能: 设置一个远指针
用  法: void far *MK_FP(unsigned seg, unsigned off);
程序例:
#include <dos.h>
#include <graphics.h>
int main(void)
{
   int gd, gm, i;
   unsigned int far *screen;
   detectgraph(&gd, &gm);
   if (gd == HERCMONO)
       screen = MK_FP(0xB000, 0);
   else
       screen = MK_FP(0xB800, 0);
   for (i=0; i<26; i++)
      screen[i] = 0x0700 + ('a' + i);
   return 0;
}

#include <dos.h>
#include <graphics.h>
int main(void)
{
   int gd, gm, i;
   unsigned int far *screen;
   //char far * screen;
   detectgraph(&gd, &gm);
   if (gd == HERCMONO)
       screen = MK_FP(0xB000, 0);
   else
    screen = MK_FP(0xB800, 0);
   for (i=0; i<26; i+=2)
   //screen[i] = 0x0700 + ('a' + i);
   //screen[i*2] =  ('a' + i);
   {
 screen[i]='a';
    screen[i+1]=15;
   }
   getchar();
   return 0;
}

很奇怪,如果定义为unsigned int far,那么这段代码不能打印,如果改为CHAR,那么就可以?!不然就要 0x0700 ,我不明白这个0X0700是作什么用处。

这个函数基本明白了 直接写显存  WINDOWS下自己制作操作系统引导  你将会发现,字符在视频缓冲区中并不是连续存放的,而是每隔一个字节存放一个。这是为什么呢?这是因为一个字符虽然仅占一个字节,但紧接着它的下一个字节要用来存放该字符的颜色值。因此,屏幕上显示的每个字符在计算机内存中都占两个字节:一个字节存放字符本身,另一个字节存放它的颜色值。
    这说明了两点:首先,必须把字符写入内存中相隔的字节中,否则你将会只看到相隔的字符,并且带有古怪的颜色。其次,如果要写带颜色的文本,或者改变某个位置原有的颜色,你就需要自己去写相应的颜色字节。如果不这样做,文本仍然会按原来的颜色显示。每个描述颜色的字节既要描述字符的颜色(即前景色),又要描述字符的背景色。一共有16种前景色和16种背景色,分别用颜色字节的低4位和高4位来表示。   
    这部分内容对一些缺乏经验的程序员来说可能有点复杂,但还是比较容易理解的。只要记住有16种颜色,其编号范围是从。到15,要得到颜色字节的值,只需把前景色的值和背景色值的16倍相加即可。


字体:

Permanant URI永久地址 http://www.shengfang.org/blog/p/ucosii1xx.php
Trackback URI引用地址 http://www.shengfang.org/blog/tb.php?tb_id=1122009063

2005年7月22日13:11星期五  [Dev开发] 追踪此文的RSS
qiaoqiao在 2005年9月7日11:35星期三 评论:
用unsigned int的时候,其实指针指向的位置为2个字节(turbo c下是这样),而用char时候,指针指向的位置只是一个字节。07其实被用来表示颜色,不信的话你可以试试讲07改为15之内的其他数字,其结果只是颜色的改变。
Yippee 回复于 2005年9月7日13:02
多谢指点,应该是INT是两个BYTE,CHAR是一个BYTE。如果用INT的话。0X0700+'A'实际上就是 0X07 0X31,那么screen[i] = 0X31,screen[i+1]=0x07 
screen[i*2] =  ('a' + i);所以这里用2跳。如果用CHAR,那么就是一个一个赋值、颜色。谢谢!

称呼:    登陆   注册
   不注册,但记住我的信息
邮件:
(非必须)
评论: [UBB代码帮助]
粗体 斜体 下划线 链接 水平线 引用



验证码: 请输入你看见的数字
关闭UBB      提交时自动将内容复制到剪贴板

公告
Fire and Motion!

统计信息
[Yippee]||[统计]||日志:1839
在线: 14||用户: 2576 [列表]
今日:2245||到访:2854099
Rss:885225||评论:1604

最新日志

最新评论

友情链接

日历

最新引用

搜索

归档

杂项
Get RSS Feed (Version 2.0)
Get Atom Feed (Version 0.3)
编码:  UTF-8