暑期实习,找到一份做固件的实习。跟我一直所追求的还是有一些差距。不过正是以前的积累,能够对我学习新的知识有很大帮助。
第一个代码依然还是拥抱世界 hello world 啦
我们需要修改三个文件
text1.c
text1.inf
Nt32Pkg.dsc
/** @file This is a simple shell application Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #include <Uefi.h> #include <Library/UefiApplicationEntryPoint.h> #include <Library/UefiLib.h> /** as the real entry point for the application. @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. @retval EFI_SUCCESS The entry point is executed successfully. @retval other Some error occurs when executing this entry point. **/ EFI_STATUS EFIAPI main ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { Print(L"hello world "); return EFI_SUCCESS; }
## @file # Sample UEFI Application Reference EDKII Module # # This is a simple shell application # # Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> # # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # # ## [Defines] INF_VERSION = 0x00010005 BASE_NAME = text1 FILE_GUID = 1D73FF57-579C-40F2-BA4F-851DFE50B614 MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 1.0 ENTRY_POINT = main # # The following information is for reference only and not required by the build tools. # # VALID_ARCHITECTURES = IA32 X64 IPF EBC # [Sources] text1.c [Packages] MdePkg/MdePkg.dec [LibraryClasses] UefiApplicationEntryPoint UefiLib
其实就编写的基本流程来说,分为一下几个步骤
- 复制要编写的程序模板,其中至少包括 *.c *.inf 文件
- *.C 文件中,我们要做两件事情
- 修改想要的入口函数名
- 在主函数中实现想要的功能
- *.inf 文件中,我们做以下事情
- 在defines中,
- 修改BASE_NAME --> 生成的模块名字
- 修改GUID标识(使用VS自带工具)
- 修改ENTRY_POINT --> 入口函数名 (与 *.c 文件对应)
- 在sources中, 声明所包含的子文件。在本次实验中只包含 text1.c 一个文件
- 在defines中,
- 在NT32Pkg目录下找到Nt32Pkg.dsc ,将我们需要新编译的*.inf文件添加在 Components 之中完成声明。
在编译过程中,出现了一点小问题。就是在根目录下采用 build -p Nt32PkgNt32Pkg.dsc 编译后并不能编译出新的可执行的 *.elf 文件
只能采用build -p Nt32PkgNt32Pkg.dsc -a IA32 -m ShellPkgApplication ext1 ext1.inf 进入文件目录后编译才可以。
另外一个问题就是如果在*.c文件中输出字符串后面不加 。 会导致字符输出不全,我的只显示 orld 四个字符。询问前辈得知是由于被覆盖,具体不详