1.2.1 显示字符串
在显示器驱动程序中,printk函数用于将指定的字符串显示到显示器上,显示位置由(x,y)坐标指定。printk函数的参数为需显示字符串的起始地址。printk函数的实现详见代码清单1.5。本节以在main函数中调用printk函数显示字符串“hello,world.”为例,分析printk函数的处理过程。
代码清单1.5 printk函数
下面分析代码清单1.5。
• 第14~15行:通过while循环计算字符串的长度,计算得到字符串“hello,world.\n”的长度为14,其中字符“\n”为换行符(ASCII值为10)。
• 第16行:调用erase_char函数擦除光标,具体擦除过程详见1.2.2节。光标由字符“_”表示,用于指示下一个显示字符在显示器上的位置。因此,在显示字符前,需要先将光标清除。
• 第17~34行:循环遍历字符串中的所有字符,根据字符的ASCII值进行相应的处理。其中,第19行表示从字符串中获取待处理字符的ASCII值。
• 第20~27行:若该字符为可显示字符(ASCII值为32~126),则调用write_char函数(第22行)将字符直接显示在显示器上,显示过程详见1.1.2节。第23行表示将显示器上当前行已显示字符的个数保存到sum_char_x数组中,每行对应数组中的1项,总共50项,sum_char_x数组的定义详见第7行。在第24行中,将列数加一。在第25~26行中,若该字符为当前行的最后一个字符,则调用cr_lf函数进行回车换行处理,处理过程详见1.2.3节。
• 第28~29行:若该字符为换行符(ASCII值为10)或回车符(ASCII值为13),则调用cr_lf函数进行处理。当字符串“hello,world.”被处理到最后一个字符“\n”时,调用cr_lf函数进行回车换行处理。
• 第30~31行:若该字符为删除符(ASCII值为127),则调用del函数进行处理,处理过程详见1.2.5节。
• 第32~33行:若该字符不属于以上情况,则视为不可识别字符,调用panic函数显示错误信息,处理过程详见1.2.6节。
• 第35行:当字符串处理结束后,调用write_char函数在字符串末尾显示光标,并指示下一个显示字符在显示器上的位置。