(转)C语言在哪里?
原文地址:http://hi.baidu.com/nios4fun/blog
上次写那几行程序确实没用到C标准库里的函数,altera_avalon_seg7_×× ×是我们自己定义的,不算数。典型的C标准库函数有:open() close() printf() read()...等等,在电脑上用C语言写应用程序,就是拿C标准库函数拼拼凑凑而成。
C语言的简单易用性有目共睹,软件设计人员早已习惯了C语言的语法和思维逻辑,nios要将软件设计和硬件设计隔离开,必须迎合软件设计者的习惯,引入C标准库,这样才能使软件开发人员从其它平台的开发转到nios的时候,不会觉得突兀和陌生。
软件开发人员不会去关心底层硬件实现细节,所谓软件,是很虚的东西,逻辑功能的组织和具体落实到硬件毕竟是两回事,因此必须把C标准库中那些很“虚”的函数跟实际的硬件操作对应起来,这个过程称为“移植”。
既然规定nios的软件用C语言实现,altera肯定为用户完成了C标准库的移植,将C标准函数与硬件操作一一对应。但是,硬件种类千千万万,altera考虑得再怎么周全,也不可能顾得上所有的硬件,于是,它想出一个办法:把 硬件分门别类,把同一类硬件的共性提取出来,形成一个“虚拟设备”,然后确定这个“虚拟设备”适用于C标准库的哪些函数,把这些函数指针放到一个结构体 中,OK,它的任务就算完成了。如果设计人员想把一个硬件外设加入nios系统,如果他希望别人能用C函数访问到该硬件,那么,请他考量一下这个硬件能够 归到哪个“虚拟设备”名下,然后对照着这个“虚拟设备”的结构体,自个儿实现结构体中的函数去吧。说到底,这些C标准函数对应什么样的硬件操作,还得自己去填&……%#*!
nios的“虚拟设备”有6种:
◆ 字符型设备
hardware peripherals that send and/or receive characters serially, such as a UART.
◆ 文件子系统
provide a mechanism for accessing files stored within physical device(s).
◆ DMA设备
peripherals that perform bulk data transactions from a data source to a destination.
◆ 定时器设备
hardware peripherals that count clock ticks and can generate periodic interrupt requests.
◆ FLASH设备
nonvolatile memory devices that use a special programming protocol to store data.
◆ 以太网设备
provide access to an Ethernet connection for the Altera-provided lightweight IP protocol stack.
似乎写得有点乱了,举个例子清醒清醒。
以LCD显示屏为例,按照“字符型设备”的定义- 串行发送或接收字符的硬件外设,可以确定将LCD显示屏归入“字符型设备”,定义“字符型设备”的头文件为alt_dev.h,定义“LCD显示屏”的头 文件为altera_avalon_lcd_16207.h,两者对应关系如下图:
结构体alt_dev_s定义了“字符型设备”的共性:能被open() close()等一系列C标准函数访问,所以,表示LCD显示屏的结构体alt_LCD_16207_dev里包含“共性”的alt_dev类型的变量 dev,还有其它一些“个性”的属性base、alarm等,实例化dev就实现了C标准库函数与硬件操作的一一对应,实际上,这个例子中只完成了 write()→alt_lcd_16207_write()的对应,其它函数以空指针NULL代替。
这样,我们就可以在软件中用write()向LCD显示屏输出字符。