通常可藉由变更在微控制器上执行的软件扩增新功能,或为装置出货前没发现到的问题除错,例如血糖计,仅须修改软件就能使用新型试纸;某些顾客桌面上无法使用的光学鼠标,修改软件能重新设定影像传感器采集到的数据特征。这类的设计变更不须重新设计硬件的配置,已成为相当常见的作法,能在产品还未出厂时,即迅速对硅组件更新编程,在顾客方面,直接编程是不切实际的方法,因为需要特殊的硬件连结微控制器上的专属接脚,若装置已需USB作为通讯机制,把一个简单的开机管理应用程序加到原始韧体,就能使用标准计算机下载新版与后续更新的韧体,并可由制造商或终端使用者执行更新动作。
几乎无所不在的通用序列总线(USB)通讯媒介,原用来把鼠标或键盘连结至计算机,后来已扩展至喇叭、摄影机、打印机及其它各种装置,如今像吉他到轿车都已配备USB接口。在这类装置中,利用现有的USB联机变更在嵌入式控制器上执行的软件,就能扩增新功能或解决效能故障方面的问题,且研发业者不但可充分发挥本身具备的好处,并可提供产品重新编程的弹性。
在嵌入式微控制器中,开机管理程序是一个位于程序内存内的小程序。当重新启动或开机时,开机管理程序会率先执行,并让处理器执行使用者的程序或下载新版程序,在这种组态下,直接编程仅须把开机管理程序插入至程序内存。开机管理程序可使用不同的通讯技术采集新程序,包括USB、I2C、SPI、UART,甚至可建置专属的通讯协议以下载新程序,也可使用不同的方法储存下载的程序。根据内存的需求,程序可储存在微控制器内部的闪存,或是各种外部储存媒体,由于大多数开机管理程序仅需少量的程序空间即可建置,因此通常和使用者的程序装在同一片闪存中,在并存时,开机管理程序须负责把程序代码下载到同一片内存时,防止覆盖本身的程序代码,在内存空间的开机管理程序,可设定成不可覆写,以避免意外的毁损。
开机管理程序扮演重要角色
图1 USB开机管理程序的数据流程
图1显示USB开机管理程序的数据流。在开机重新启动时,开机管理程序会计算使用者程序的检查码,并和储存在内存中的检查码进行比对。这个检查码是现场可编程开机管理程序的检查码模块,若两个数值相符,开机管理程序就会让处理器开始执行使用者的程序,但若检查码不一致,开机管理程序就会让主机等候分送新的使用者程序代码。在准备阶段,开机管理程序会关闭任何可能干扰下载流程的岔断,在某些系统中,微控制器可能须处理一些重要作业,然后再开始下载,如可能必须启动散热风扇或让某些发光二极管(LED)灯号闪动,由于应用程序的空间是被删除的目标,因此如散热风扇或LED灯号的控制例程等这类关键作业须写入开机管理程序。
为了开始通讯,开机管理程序会设定USB接口,然后等待计算机连结装置。计算机透过交握程序了解何种装置插入连结端口,此程序称为装置列举,可确保装置和正确的主控端软件进行通讯,在这个例子中,主控端是个人计算机(PC)应用程序,程序中含须下载的内容,为避免意外下载,并确保安全,开机管理程序会在交易过程中寻找主控端的金钥。
检查金钥后,开机管理程序会对主控端做出响应,并要求取得Flash映像,由于闪存不支持单一地址写入,故须使用完整分页写入。在找出整个分页的地址前,会先把传入的数据储存在随机存取内存(RAM),由于处理器在此刻正忙着下载新韧体,因此几乎所有RAM资源都可使用,系统必须在较低的温度把内容稳定写入至闪存,为增加内存保存数据时间及写入周期的次数,了解现场温度及使用合适的编程算法相当重要。
在快闪编程过程中,电源的稳定度也是一项重要因素,任何电源噪声、故障、断电、电位缓升、接触不良等状况,都会造成难以侦测的问题。若真的发生电力瞬时问题,开机管理程序就会再次启动,并因检查码核对失败而重新开始下载程序,当所有Flash分页都含有检查码并成功写入,开机管理程序就会检查闪存并开始重新启动,此时当系统重新启动后,开机管理程序会搜寻正确的检查码,并开始执行使用者程序代码。
图2 通用型开机管理程序架构
当检查码有效时,所有后续的开机管理程序作业都必须从执行中的使用者程序代码呼叫。透过正确的应用程序接口呼叫,PC程序能直接指挥使用者程序关闭所有岔断、重置USB硬件及开始扮演开机管理程序。另一方面,装置设定完成后,藉由如开关等某些硬件状态变更事件,便进入开机管理程序的装置列举程序。
内存管理可避免
无法使用USB下载数据问题
开机管理程序被意外删除会导致系统无法透过USB下载数据。系统化的内存配置,能减少或消弭这种意外的风险,图2所示为一个可行的配置,可由各种Flash架构运用,图中由上而下第一组模块含有重置与USB岔断向量,第二组则含有开机管理程序设定的内存区域,含有用来搜寻开机管理程序检查码的启动指令,用以下载新映像的程序代码,以及用来储存检查码的空间,这组程序代码可重设位置,不同的区块可置入专属的内存区域,然而,当项目设计准备开始建置,除检查码外,这区域的所有空间都不可升级。
第三组则是供使用者程序使用,这个部分含有使用者程序代码、所有相关的岔断向量及呼叫开机管理程序的例程,这个区域可重新编程与重新寻址,但在开机管理程序下载程序代码时无法被存取。任何指向此区域的岔断,在呼叫任何开机管理程序函式之前都应关闭,若在执行时程序内容会变更,则应考虑可能发生的各种问题。
在个人计算机方面,应用程序须和装置进行通讯,以及传送新的使用者程序代码。研发业者会透过网站或光盘获得所需软件,软件须能要求装置进入开机状态,并提供正确的验证金钥,当装置准备好时,主控端应传送新的内容,以便写入至闪存,并启动下载程序的使用者程序,且应记住开机管理程序的内存配置,这方面须知道使用者程序代码的开始与结束位置及检查码等数据。在正常的运作模式下,开机管理程序会连结至正确的地址,找到使用者程序代码的开端,使用者程序代码发出的任何开机呼叫,都会指向开机管理程序例程的正确地址。
计算机可使用各种不同的机制,把内容透过USB传送到开机管理程序,根据装置内开机管理程序的需求,可利用控制、岔断或批次传输以传送数据,装置内的USB描述亦可决定程序须支持的驱动程序类型,并可设定让程序使用操作系统的人机接口装置驱动程序,或使用特定厂商的驱动程序。
简化启动程序
开机启动其实是一个常见的程序,个人计算机使用相同的原理把操作系统从硬盘加载到计算机,许多参考设计方案与网络上的项目设计范例,能协助在嵌入式设计中建置开机管理程序,如厂商推出的PSoC Designer工具能用来建立一个USB或I2C开机管理程序,并能搭配各种可编程系统单芯片或PSoC。USB开机管理程序的使用者模块会产生所有必要的开机管理程序代码,能和使用者程序并存运作,此工具让业者设计出全速、符合Chapter 9标准规范、人机接口装置或原生USB装置,引导精灵会协助产生精确的USB描述,并利用岔断或控制传输类型支持开机管理程序的转换。
使用者模块会根据设计时预测的需求产生开机管理程序代码(表1),其会搜寻各种可供选择的参数,如使用者程序第一个和最后一个模块、开机管理程序第一个与最后一个区块及检查码的地址,开机管理程序的大小也可自行调整,以便插入任何必须和下载程序一起进行的特殊程序代码,USB交易需要的金钥也可自行设定,而了解未来开机管理程序可能面临的环境温度,可让工具能产生适合的编程例程,最后,使用者可产生像void BootLdrUSB_EnterBootloader(void)例程,让使用者程序代码能从软件程序启动开机程序。
表1 USB开机管理程序搜寻各种可选择参数
用户模块参数
参数值
TW0_Block_Relocatable_Interrupt_Table
4C
ApplicationCode_Start_Block
4E
Last_Application_Block FE
FE
Application_Checksum_Block
FF
Bootloader_Start_Block 2
2
Bootloader_Size
4B
BootloaderKey
0001020304050607
Flash_Program_Temperature_deg_C
-40C
ICE_Debug_FLASH_DISABLE
DISABLE_FLASH_WRITE
BootLdrUSBFS_ver
1000
模块会产生一个有效的内容检查码,内容是透过开机管理程序下载而来,另一个工具从编译器的输出端提供下载档案,这个*.dld档案含有hex编码格式的内容,和新的检查码一起编排成Flash模块,且可透过由Visual Basic或C#语言撰写的个人计算机程序分析读取。本文列举之上述方式,可把新的使用者程序透过USB接口下载到装置中,让最终使用者升级其产品、除错或改进功能,不但不须使用任何特殊硬件进行升级,且毋需成本昂贵的产品召回或更换作业。