1. 简介
Synthetic Target同样包含多种硬件设备,当然它们都是虚拟的, 其中一部分设备通过Linux系统调用就可以实现,不需要I/O辅助进程的参与, 这类设备包括Disk、ADC、Flash、WallClock(实时时钟)、RTC(系统嘀嗒), 另一部分设备必须和I/O辅助进程相配合才能实现,这类设备包括Ethernet、Framebuffer、Watchdog。 此外,Synthetic下的诊断输出既可以通过Linux系统调用直接输出到终端, 也可以通过I/O辅助进程输出到I/O辅助进程的主窗口上。
本文是《eCos Synthetic实践》系列的第二篇,介绍不需要I/O辅助进程参与的简单设备。
Synthetic基本原理请阅读参考资料的《eCos的Linux Synthetic Target简介》。
2. Diag(诊断输出)
诊断输出是作为HAL的一部分提供的,并不是单独的模块。
调用diag_printf函数输出诊断信息,diag_printf函数原型和printf函数原型一致, 可以像使用printf函数一样使用diag_printf函数,只是diag_printf不支持浮点数。 要打印浮点数,只能使用printf函数,printf函数需要ISO C library standard input/output functions组件, 而且需要勾上Floating point support选项。尽量避免使用printf,因为printf的实现是基于I/O子系统的, 会绕很大一个弯才将字符输出,而diag_printf是直接引用HAL接口实现的。
在没有I/O辅助进程的情况下,诊断输出到终端,在有I/O辅助进程的情况下,诊断输出到I/O辅助进程主窗口。
3. RTC(系统嘀嗒)
再一次解释,在eCos中,RTC指的是Tick Timer,也就是嘀嗒定时器或者系统嘀嗒或者时钟嘀嗒, 是指为操作系统提供超时、时间片轮的定时器,不是指提供年月日时分秒的实时时钟, 虽然RTC的英文字面确实是实时时钟的意思,提供年月日时分秒的实时时钟在eCos中被称为WallClock, 字面意思为挂钟,为什么当年eCos的作者会选择这个名字呢? 一个可能的原因是早期计算机的系统嘀嗒和实时时钟是由同一块电路提供的, 即使是现在,很多实时时钟芯片仍然提供32.768KHz的周期信号, 完全可以使用该32.768KHz信号作为嘀嗒定时器的时钟源,这种实现方式还可以将系统嘀嗒和实时时钟同步起来。
跟诊断输出一样,RTC是作为HAL的一部分提供的,并不是单独的模块。
与RTC相关的选项
- Real-time clock period: 为系统嘀嗒的时间间隔,单位为微秒。
- Real-time clock denominator: Real-time clock numerator除以Real-time clock denominator所得值也是系统嘀嗒的时间间隔,单位为纳秒。
- Real-time clock numerator: Synthetic Target下的Real-time clock numerator参数是使用Real-time clock numerator和Real-time clock denominator计算出来的,不能直接修改。
图 1. RTC选项
4. Wallclock(实时时钟)
Wallclock提供实时时钟功能,跟Linux一样,eCos的实时时钟提供的时间值是从1970-01-01 00:00:00开始到当前时刻的秒数, 通过C库函数可以将这个值转换成直观的日期和时间。
使用Wallclock需要添加Wallclock device framework(CYGPKG_IO_WALLCLOCK)组件,通过eCos Configuration Tool的菜单Build > Packages打开Packages对话框, 在左边的列表中选择Wallclock device framework点击Add>>按钮添加到右边列表。
图 2. 添加新组件
与Wallclock相关的选项
- Hardware wallclock: 选择使用硬件时钟,事实上在Synthetic不存在任何真实硬件,一切都是软件实现的,选择这个选项将使用Linux系统的时钟。
- Name of file wich holds system-eCos wallclock offset: 该配置项指定一个文件名,该文件保存eCos系统时钟与Linux系统时钟的偏差,在eCos系统内修改时钟不会影响Linux系统时钟, 而是记录两个时钟时间的偏差,eCos系统读取时钟时首先通过系统调用读取Linux系统时钟,然后在Linux系统时钟的基础上加上偏差。
图 3. Wallclock选项
5. ADC(模数转换器)
使用ADC需要添加Generic ADC Support(CYGPKG_IO_ADC)组件,通过eCos Configuration Tool的菜单Build > Packages打开Packages对话框, 在左边的列表中选择Generic ADC Support点击Add>>按钮添加到右边列表。
与ADC相关的选项
- Hardware ADC device drivers: 使能硬件驱动,只有在这个选项有效的情况下,驱动程序才有效。
- Sample size: 指定采样位数,默认为16位ADC。
- Default sample rate: 指定默认采样速率,即每秒钟采样的次数。
- Device name: 该通道ADC在eCos中的设备名。
- Size of data buffer: 数据缓存大小,ADC总是每次采样一个数据,而应用程序可以一次读取多个数据, ADC驱动首先把数据存储在缓存里,然后等着应用程序读取,缓存是个FIFO队列。
- Channel source: 数据源,可以配置成CONST、RANDOM、FILE这3种模式中的一种, CONST模式下,读取ADC将返回常量,常量由选项Constant sample value指定, RANDOM模式下,读取ADC将返回随机数, FILE模式下,读取ADC将返回文件中的值,如果到达文件尾部,那么重头开始,文件名由选项Sample data filename指定。
- Constant sample value: 如果Channel source选择CONST,那么该选项指定常量值。
- Sample data filename: 如果Channel source选择FILE,那么该选项指定提供数据源的文件名,为Linux系统下的文件。
图 4. ADC选项
6. Disk(磁盘)
Synthetic下的Disk使用Linux系统下的文件作为存储媒介,eCos中对磁盘的读写最终都转换成Linux系统调用对文件进行读写, 如果Disk中的内容是有效的文件系统,那么可以在Linux系统下将存储在文件内的文件系统挂载到Linux(mount -o loop)。
使用Disk需要添加Disk deivce drivers(CYGPKG_IO_DISK)组件,通过eCos Configuration Tool的菜单Build > Packages打开Packages对话框, 在左边的列表中选择Disk deivce drivers点击Add>>按钮添加到右边列表。
与Disk相关的选项
- Provide disk 0 device: 使能Disk驱动,只有将这个选项勾上,驱动程序才有效。
- Device name for ecosynth disk 0 device: Disk在eCos中的设备名。
- Linux file name for ecosynth disk 0 device: 指定镜像文件名。
- Size in bytes for ecosynth disk 0: Disk大小(存储空间)。
图 5. Disk选项
7. Flash(闪存)
与Disk设备类似,Flash也是使用Linux系统下的文件作为存储媒介的,对Flash的读写擦除都是对Linux文件的读写, 一样可以将镜像文件进行挂载。
使用Flash需要添加Generic FLASH memory support(CYGPKG_IO_FLASH)组件,通过eCos Configuration Tool的菜单Build > Packages打开Packages对话框, 在左边的列表中选择Generic FLASH memory support点击Add>>按钮添加到右边列表。
与Flash相关的选项
- Provid /dev block devices: Flash设备可以通过I/O子系统函数,例如cyg_io_lookup,cyg_io_read等函数访问,也可以直接通过Flash API访问, 如果需要通过I/O子系统访问,那么需要将选项勾上。
- Base address of flash: Flash的起始地址。
- Size of one block of synth flash: Flash块大小,Flash是按块为单位进行擦除的。
- Number of blocks in the synth flash: Flash块数目。
- Number of boot blocks in the synth flash: 引导区的块数目。
- Size of the boot blocks in the synth flash: 引导区的块大小。
- Is the boot blocks at the bottom of the flash: 是否在Flash底部提供引导区,默认使能。
- Name of file emulating synth flash: 镜像文件名,在Synthetic中,Flash实际上是存储在Linux系统上的一个文件,这个选项指定文件名。
图 6. Flash选项
8. 参考资料
在线资料
- 《eCos Synthetic实践(一)——Hello World!》
- 《XXXVIII. eCos Synthetic Target》:官方参考手册。
- 《eCos的Linux Synthetic Target简介》:官方参考手册的部分翻译。
- 《eCos需要Synthetic虚拟目标板的理由》:谁需要Synthetic,什么情况下需要Synthetic?
- 《虚拟实验室eCos开发环境的配置 (Linux)》:使用基于QEMU的模拟器运行eCos。
- VirtualBox:虚拟机软件。
- Xubuntu:易于使用又节省资源的Linux发行版。