DEC trong EDK II là gì?

Quicknote giải thích file DEC trong EDK II.

3 phút đọc
Đọc bằng Tiếng Việt English 日本語
EDK II Terms cover

DECPackage Declaration. Đây là file nói với toàn bộ EDK II rằng package này công bố những gì ra bên ngoài: include path, GUID, Protocol GUID, PPI GUID, Library Class và PCD token space.

Nói đơn giản: nếu module khác muốn dùng thứ gì từ package của bạn, thứ đó nên được công bố qua DEC trước.

Vai trò của DEC trong package

MyPkg/MyPkg.dec
├─ [Includes]              # public include directories
├─ [Guids]                 # GUID dùng chung
├─ [Protocols]             # Protocol GUID được package publish
├─ [Ppis]                  # PPI GUID cho PEI
├─ [LibraryClasses]        # interface library public
└─ [PcdsFixedAtBuild]      # PCD token space và default value

Vì sao DEC quan trọng?

Trong firmware project thật, lỗi do DEC thường không hiện ra như “DEC sai”. Nó thường hiện thành:

fatal error C1083: Cannot open include file
error 4000: Instance of library class ... is not found
error 000E: PCD ... is not found in DEC file

Vì vậy khi module khác không thấy header, GUID, Protocol hoặc PCD, DEC là nơi cần kiểm tra đầu tiên.

Ví dụ khai báo PCD và GUID

[Defines]
  DEC_SPECIFICATION = 0x00010005
  PACKAGE_NAME      = MyPkg
  PACKAGE_GUID      = 11111111-2222-3333-4444-555555555555
  PACKAGE_VERSION   = 0.1

[Includes]
  Include

[Guids]
  gMyPkgTokenSpaceGuid = { 0x11111111, 0x2222, 0x3333, { 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 }}

[Protocols]
  gMyBoardInfoProtocolGuid = { 0xaaaaaaaa, 0xbbbb, 0xcccc, { 0xdd, 0xdd, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee }}

[PcdsFixedAtBuild]
  gMyPkgTokenSpaceGuid.PcdEnableVerboseLog|FALSE|BOOLEAN|0x00000001

Sau đó module dùng PCD này phải khai báo package trong INF:

[Packages]
  MdePkg/MdePkg.dec
  MyPkg/MyPkg.dec

[Pcd]
  gMyPkgTokenSpaceGuid.PcdEnableVerboseLog

DEC không thay thế INF/DSC

Mục Giá trị Ghi chú
DEC Công bố public contract Có PCD/GUID/Header cho package khác dùng.
INF Module khai báo thứ mình consume Module nói mình dùng package/library/pcd nào.
DSC Platform quyết định instance/value Map library, override PCD, chọn module build.

Một lỗi thực tế

Bạn thêm code:

if (FeaturePcdGet(PcdEnableVerboseLog)) {
  DEBUG ((DEBUG_INFO, "verbose log enabled\n"));
}

Nhưng build báo PCD không tồn tại. Cách debug:

  1. PCD đã khai báo trong DEC chưa?
  2. Token space GUID có đúng không?
  3. INF của module có include package chứa DEC đó chưa?
  4. PCD dùng trong code có đúng macro theo type không? FeaturePcdGet, FixedPcdGetBool, PcdGet32

Checklist DEC

Ghi nhớ nhanh

DEC là “hợp đồng public” của package. Khi module khác không nhìn thấy thứ bạn nghĩ là public, hãy kiểm tra DEC trước khi sửa code C.

Bài liên quan

Nguồn tham khảo public

Thấy nội dung này hữu ích?

Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.