DEC trong EDK II là gì?
Quicknote giải thích file DEC trong EDK II.
DEC là Package 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:
- PCD đã khai báo trong DEC chưa?
- Token space GUID có đúng không?
- INF của module có include package chứa DEC đó chưa?
- 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
- INF trong EDK II là gì?
- DSC trong EDK II là gì?
- PCD trong EDK II là gì?
- EDK II Package là gì?
- FDF trong EDK II là gì?
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.