UEFI学习问题记录(四)

最近开始搞一个DDR UEFI测试程序,第一步是要建立界面,涉及到字符串的使用,在过程中遇到了不少问题,不过在解决问题的过程中也对编译的过程及模块也有了更好的理解,将过程问题记录在下:

首先,HIIFONT字符串的使用流程要经过下面三步:

1,生成.uni文件,在.uni文件中定义语言与所支持语言下的字符串。

2,在源程序中通过HiiAddPackage注册字符串资源。

3,通过字符串标识符使用对应的字符串。 

我在建立UEFI界面时,参考了EDK2里的UIApp工程,工程里使用了.uni文件和.vfr文件,.uni文件是字符串资源文件,里面包含了使用到的字符串,以及其声明的语言,其定义有相应的格式,详细可参见《UEFI原理与编程》,EDK2会在编译时将其转换成头文件和C代码,源码里包含了字符串的名字,以及所使用字符转换出来的16进制码,所有这些编译出来的内容,包含在AutoGen.c中,而对应的头文件在XXXstrDefs.h中,那么问题来了,怎么使用?我们从HiiAddPackage入手,函数调用如下,看几个参数:

    HiiHandle = HiiAddPackages (
                                  &mFrontPageGuid,
                                  NULL,
                                  FrontPageVfrBin,
                                  Uefi_MainStrings,
                                  NULL
                                 );

mFrontPageGuid是一个EFI_GUID,其值要与vfr文件中的FORMSET_GUID值保持一致(原因不清楚),而我们自己要生成vfr文件时,可以在guidgen.com网站上生成一个值,或者拷贝其他的VFR文件值,修改几个数即可。第二个参数是DeviceHandle,用来在其上安装DEVICE_PATH_PROTOCOL实例,通过这种方式就可以将资源与安装在DeviceHandle之上的其它内容(比如设备)等联系在一起,可以为NULL。剩下的FrontPageVfrBin和Uefi_MainStrings,前者是定义在FrontPageVfr.c以及AutoGen.c中,这两个字符串数组怎么使用呢?原来是在.inf文件中,在source块中加入XXX.vfr和XXX.uni即可:

[Sources]
Uefi_Main.c
Uefi_Main.h
FrontPageVfr.Vfr
Uefi_Main.uni
MYHiiFont.h
MYHiiFont.c

在这里,实际的编译过程中又会带来新的问题,在使用 HiiAddPackages时,需要使用库文件Hiilib,如果直接将Hiilib.c加入头文件,会编译不通过,且由于该文件中又调用了其他的文件,会难免顾此失彼,漏加头文件。所以需要在dsc和inf文件中加入所使用的头文件,这里也对dsc,inf文件有了更多理解,首先,inf文件是针对具体的工程,而dsc文件用于编译整个Pacakge。所以,要使文件编译成功,需要做以下步骤:

1,在inf文件中[Sources]模块加入所使用的.h,.c文件,注意,该文件必须与inf文件在同一目录下。那么问题来了,如果.h文件中使用的有库文件中的变量或者包含了库文件,难道要将库文件拷贝到当前目录下吗?

2,为了解决上面问题,inf和dsc文件就提供了解决办法,如果调用了库文件,那么就需要在inf文件的[LibraryClasses]模块加入库文件命,注意,只是文件名,而不带.h,.c等文件格式。例如:

[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib
  HiiString
  HiiLanguage

3,inf文件中定义了使用的库文件,那么编译器到哪去找这些库文件呢,这就要用到.dsc文件了,需要在所使用package的dsc文件中[LibraryClasses]下加入库命,路径,以及相应inf文件,如下,一般来说,inf文件中有该库全部的库文件定义,通过此定义,编译器就可以找到对应的.c或者.h文件。

[LibraryClasses]
HiiString|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
HiiLanguage|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf

4,工程上如果使用了Protocol,要在inf的PRODOCOL节中列出相应的guid,例如:

[Protocols]
  gEfiSimpleTextInputExProtocolGuid             ## CONSUMES
  gEfiGraphicsOutputProtocolGuid
  gEfiSmbiosProtocolGuid
  gEfiFormBrowser2ProtocolGuid

编译器具体怎么寻到这些guid,还不知道。

以上就是这一阶段的收获,如果设置不好,编译的时候会出现LNK2001及LNK1120等编译链接错误。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值