news 2026/8/27 9:56:37

ACPI!PciConfigSpaceHandlerWorker函数中的ACPI!GetOpRegionScope最终调用了ACPI!IsPciDevice

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!PciConfigSpaceHandlerWorker函数中的ACPI!GetOpRegionScope最终调用了ACPI!IsPciDevice

ACPI!PciConfigSpaceHandlerWorker函数中的ACPI!GetOpRegionScope最终调用了ACPI!IsPciDevice

ACPI!IsPciDevice函数和ACPI!GetPciAddress函数是ACPI里面比较重要和麻烦和容易产生新的异步_CTXT的地方。

第一部分:

1: kd> x ACPI!gReadyQueue
f743a928 ACPI!gReadyQueue = struct _ctxtq
1: kd> dx -r1 (*((ACPI!_ctxtq *)0xf743a928))
(*((ACPI!_ctxtq *)0xf743a928)) [Type: _ctxtq]
[+0x000] dwfCtxtQ : 0x2 [Type: unsigned long]
[+0x004] pkthCurrent : 0x0 [Type: _KTHREAD *]
[+0x008] pctxtCurrent : 0x0 [Type: _ctxt *]
[+0x00c] plistCtxtQ : 0x898f8010 [Type: _List *]
[+0x010] dwmsTimeSliceLength : 0x64 [Type: unsigned long]
[+0x014] dwmsTimeSliceInterval : 0x64 [Type: unsigned long]
[+0x018] pfnPauseCallback : 0x0 [Type: void (__cdecl*)(void *)]
[+0x01c] PauseCBContext : 0x0 [Type: void *]
[+0x020] mutCtxtQ [Type: _mutex]
[+0x028] Timer [Type: _KTIMER]
[+0x050] DpcStartTimeSlice [Type: _KDPC]
[+0x070] DpcExpireTimeSlice [Type: _KDPC]
[+0x090] WorkItem [Type: _WORK_QUEUE_ITEM]
1: kd> dx -r1 ((ACPI!_List *)0x898f8010)
((ACPI!_List *)0x898f8010) : 0x898f8010 [Type: _List *]
[+0x000] plistPrev :0x897de010[Type: _List *]
[+0x004] plistNext : 0x89903010 [Type: _List *]
1: kd> dx -r1 ((ACPI!_List *)0x897de010)
((ACPI!_List *)0x897de010) : 0x897de010 [Type: _List *]
[+0x000] plistPrev :0x897e0010[Type: _List *]
[+0x004] plistNext : 0x898f8010 [Type: _List *]

第二部分:

1: kd> g
Breakpoint 13 hit
eax=00000000 ebx=f743a948 ecx=f743a948 edx=00002700 esi=898b9000 edi=898baf34
eip=f7427709 esp=f791acf8 ebp=f791ad1c iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
ACPI!ParseCall:
f7427709 55 push ebp
1: kd> g
Breakpoint 48 hit
eax=8992c19c ebx=89996d68 ecx=898b90ac edx=899bf300 esi=8992c19c edi=899bf33c
eip=f740d62c esp=f791ac14 ebp=f791ac2c iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
ACPI!PciConfigSpaceHandlerWorker:
f740d62c 55 push ebp
1: kd> kc
#
00 ACPI!PciConfigSpaceHandlerWorker
01 ACPI!PciConfigSpaceHandler
02 ACPI!InternalOpRegionHandler
03 ACPI!AccessBaseField
04 ACPI!AccessFieldData
05 ACPI!ReadFieldObj
06 ACPI!RunContext
07 ACPI!InsertReadyQueue
08 ACPI!RestartCtxtPassive
09 ACPI!ACPIWorker
0a nt!PspSystemThreadStartup
0b nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x8992c19c
CompletionStatus = 0n0
Result = 0x00000000
Context = 0x899bf300
bytesWritten = 0
status = 0n0
interface = 0xf740d62d
oldIrql = 0x89 ''
Complain = 0x00 ''
length = 0
ErrorLogged = 0x00 ''
ACPIName = unsigned short [5]
IllegalPCIOpRegionAddress = unsigned short *[2]
addressBuffer = unsigned short [13]
parent = unsigned char [5] ""
opRegion = unsigned char [5] "hm???"
1: kd> dt PCI_CONFIG_STATE 0x899bf300
ACPI!PCI_CONFIG_STATE
+0x000 AccessType : 0
+0x004 OpRegion : 0x8992c4c0 _NSObj
+0x008 Address : 0
+0x00c Size : 4
+0x010 Data : 0x898bae44 -> 0
+0x014 Context : 0
+0x018 CompletionHandler : 0xf7420914 Void
+0x01c CompletionContext : 0x898b90ac Void
+0x020 PciObj : 0x8992c19c _NSObj
+0x024 ParentObj : (null)
+0x028 CompletionHandlerType : 0
+0x02c Flags : 0
+0x030 RunCompletion : 0n-1
+0x034 Slot : _PCI_SLOT_NUMBER
+0x038 Bus : 0 ''
+0x039 IsPciDeviceResult : 0 ''
1: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_NSObj *)0x8992c4c0)
((ACPI!_NSObj *)0x8992c4c0) : 0x8992c4c0 [Type: _NSObj *]
[+0x000] list [Type: _List]
[+0x008] pnsParent : 0x8992c19c [Type: _NSObj *]
[+0x00c] pnsFirstChild : 0x0 [Type: _NSObj *]
[+0x010] dwNameSeg : 0x53474552 [Type: unsigned long]
[+0x014] hOwner : 0x899af330 [Type: void *]
[+0x018] pnsOwnedNext : 0x8992c3f4 [Type: _NSObj *]
[+0x01c] ObjData [Type: _ObjData]
[+0x030] Context : 0x0 [Type: void *]
[+0x034] dwRefCount : 0x0 [Type: unsigned long]
1: kd> db 0x8992c19c
8992c19c d4 b8 92 89 64 ca 92 89-ac ff 9a 89 e0 c1 92 89 ....d...........
8992c1ac 50 45 36 32 30 f3 9a 89-58 c1 92 89 00 00 06 00 PE620...X.......
8992c1bc 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
8992c1cc 28 96 92 89 00 00 00 00-48 4e 53 4f 44 00 00 00 (.......HNSOD...
8992c1dc 00 a0 92 89 40 c6 92 89-84 c2 92 89 9c c1 92 89 ....@...........
8992c1ec 00 00 00 00 5f 41 44 52-30 f3 9a 89 9c c1 92 89 ...._ADR0.......
8992c1fc 00 00 01 00 00 00 00 00-02 00 17 00 00 00 00 00 ................
8992c20c 00 00 00 00 00 00 00 00-00 00 00 00 48 50 4b 47 ............HPKG


1: kd> t
eax=00001000 ebx=899bf300 ecx=00001000 edx=8992c4c0 esi=00000103 edi=8992c4f0
eip=f740d506 esp=f791abac ebp=f791ac10 iopl=0 nv up ei pl nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206
ACPI!GetOpRegionScope:
f740d506 55 push ebp
1: kd> kc
#
00 ACPI!GetOpRegionScope
01 ACPI!PciConfigSpaceHandlerWorker
02 ACPI!PciConfigSpaceHandler
03 ACPI!InternalOpRegionHandler
04 ACPI!AccessBaseField
05 ACPI!AccessFieldData
06 ACPI!ReadFieldObj
07 ACPI!RunContext
08 ACPI!InsertReadyQueue
09 ACPI!RestartCtxtPassive
0a ACPI!ACPIWorker
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> dv
OpRegion = 0x8992c4c0
CompletionHandler = 0xf740d62c
CompletionContext = 0x899bf300
PciObj = 0x8992c4f0


1: kd> t
eax=8992c4c0 ebx=899bf300 ecx=8992c4f0 edx=899bf2d8 esi=00000103 edi=899bf2f8
eip=f740d44a esp=f791ab90 ebp=f791aba8 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
ACPI!GetOpRegionScopeWorker:
f740d44a 55 push ebp
1: kd> kc
#
00 ACPI!GetOpRegionScopeWorker
01 ACPI!GetOpRegionScope
02 ACPI!PciConfigSpaceHandlerWorker
03 ACPI!PciConfigSpaceHandler
04 ACPI!InternalOpRegionHandler
05 ACPI!AccessBaseField
06 ACPI!AccessFieldData
07 ACPI!ReadFieldObj
08 ACPI!RunContext
09 ACPI!InsertReadyQueue
0a ACPI!RestartCtxtPassive
0b ACPI!ACPIWorker
0c nt!PspSystemThreadStartup
0d nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x8992c4c0
Status = 0n0
Result = 0x00000000
Context = 0x899bf2d8


1: kd> kc
#
00 ACPI!IsPciDevice
01 ACPI!GetOpRegionScopeWorker
02 ACPI!GetOpRegionScope
03 ACPI!PciConfigSpaceHandlerWorker
04 ACPI!PciConfigSpaceHandler
05 ACPI!InternalOpRegionHandler
06 ACPI!AccessBaseField
07 ACPI!AccessFieldData
08 ACPI!ReadFieldObj
09 ACPI!RunContext
0a ACPI!InsertReadyQueue
0b ACPI!RestartCtxtPassive
0c ACPI!ACPIWorker
0d nt!PspSystemThreadStartup
0e nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x8992c19c
CompletionHandler = 0xf740d44a
CompletionContext = 0x899bf2d8
Result = 0x899bf2e4 ""
1: kd> db 0x8992c19c
8992c19c d4 b8 92 89 64 ca 92 89-ac ff 9a 89 e0 c1 92 89 ....d...........
8992c1ac 50 45 36 32 30 f3 9a 89-58 c1 92 89 00 00 06 00 PE620...X.......
8992c1bc 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
8992c1cc 28 96 92 89 00 00 00 00-48 4e 53 4f 44 00 00 00 (.......HNSOD...
8992c1dc 00 a0 92 89 40 c6 92 89-84 c2 92 89 9c c1 92 89 ....@...........
8992c1ec 00 00 00 00 5f 41 44 52-30 f3 9a 89 9c c1 92 89 ...._ADR0.......
8992c1fc 00 00 01 00 00 00 00 00-02 00 17 00 00 00 00 00 ................
8992c20c 00 00 00 00 00 00 00 00-00 00 00 00 48 50 4b 47 ............HPKG


1: kd> kc
#
00 ACPI!IsPciDeviceWorker
01 ACPI!IsPciDevice
02 ACPI!GetOpRegionScopeWorker
03 ACPI!GetOpRegionScope
04 ACPI!PciConfigSpaceHandlerWorker
05 ACPI!PciConfigSpaceHandler
06 ACPI!InternalOpRegionHandler
07 ACPI!AccessBaseField
08 ACPI!AccessFieldData
09 ACPI!ReadFieldObj
0a ACPI!RunContext
0b ACPI!InsertReadyQueue
0c ACPI!RestartCtxtPassive
0d ACPI!ACPIWorker
0e nt!PspSystemThreadStartup
0f nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x8992c19c
Status = 0n0
Result = 0x00000000
Context = 0x899bf2a8


Device (PE62)
{
Name (_ADR, 0x00170002) // _ADR: Address


NTSTATUS
EXPORT
IsPciDeviceWorker(
IN PNSOBJ AcpiObject,
IN NTSTATUS Status,
IN POBJDATA Result,
IN PVOID Context
)
/*++

Routine Description:

This is the worker function for determining whether
or not a namespace object represents a PCI device.
The algorithm is as follows:

1) Does this device have a _HID of PNP0A03? If
so, it is a PCI device.

2) Does this device have a _CID of PNP0A03? If
so, it is a PCI device.

3) Does this device have an _ADR?

a) No, not a PCI device.

b) Yes, check to see if the parent qualifies
as a PCI device. If it does, this must
also be a PCI device. If not, then it is not.


//
// Step 1), check the _HID.
//

if (!(state->Flags & PCISUPP_CHECKED_HID)) {

state->Flags |= PCISUPP_CHECKED_HID;
state->Hid = NULL;

hidObj = ACPIAmliGetNamedChild( state->AcpiObject, PACKED_HID );

if (hidObj) { 不符合条件


1: kd> p
eax=00000000 ebx=00000000 ecx=8992c19c edx=899bf2a8 esi=899bf2a8 edi=00000103
eip=f740d195 esp=f791ab40 ebp=f791ab4c iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!IsPciDeviceWorker+0x4f:
f740d195 85c0 test eax,eax

//
// Step 2), check the _CID.
//

if (!(state->Flags & PCISUPP_CHECKED_CID)) {

state->Flags |= PCISUPP_CHECKED_CID;
state->Cid = NULL;

cidObj = ACPIAmliGetNamedChild( state->AcpiObject, PACKED_CID );


1: kd> p
eax=00000000 ebx=00000000 ecx=8992c19c edx=899bf2a8 esi=899bf2a8 edi=00000103
eip=f740d20e esp=f791ab40 ebp=f791ab4c iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!IsPciDeviceWorker+0xc8:
f740d20e 85c0 test eax,eax

//
// Step 3), check the _ADR.
//

if (!(state->Flags & PCISUPP_CHECKED_ADR)) {

state->Flags |= PCISUPP_CHECKED_ADR;
status = ACPIGetNSAddressAsync(
state->AcpiObject,
IsPciDeviceWorker,
(PVOID)state,
&(state->Adr),
NULL); 这里阻塞了。

if (status == STATUS_PENDING) {
return status;
}

1: kd> t
eax=899bf2b0 ebx=00000000 ecx=8992c19c edx=899bf2a8 esi=899bf2a8 edi=00000103
eip=f74076b8 esp=f791ab18 ebp=f791ab4c iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
ACPI!ACPIGet:
f74076b8 55 push ebp
1: kd> kv
# ChildEBP RetAddr Args to Child
00 f791ab14 f740d29c 8992c19c 5244415f 48040402 ACPI!ACPIGet (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\get.c @ 76]
01 f791ab4c f740d401 8992c19c 00000000 00000000 ACPI!IsPciDeviceWorker+0x156 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 1460]
02 f791ab68 f740d4ac 8992c19c f740d44a 899bf2d8 ACPI!IsPciDevice+0x4f (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 1274]
03 f791ab8c f740d55b 8992c4c0 00000000 00000000 ACPI!GetOpRegionScopeWorker+0x62 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 2096]
04 f791aba8 f740d68d 8992c4c0 f740d62c 899bf300 ACPI!GetOpRegionScope+0x55 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 2049]
05 f791ac10 f740d9dd 8992c19c 00000000 00000000 ACPI!PciConfigSpaceHandlerWorker+0x61 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 596]
06 f791ac2c f742813d 00000000 8992c4c0 00000000 ACPI!PciConfigSpaceHandler+0x6d (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 424]
07 f791ac5c f7418f7d 00000000 8992c4c0 00000000 ACPI!InternalOpRegionHandler+0x67 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\shared\acpioprg.c @ 160]
08 f791aca0 f741929b 898b9000 8992c4c0 00000004 ACPI!AccessBaseField+0x185 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\object.c @ 1259]
09 f791accc f7419645 898b9000 8992c4c0 898bae48 ACPI!AccessFieldData+0x179 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\object.c @ 1046]
0a f791acf4 f741d832 898b9000 898bae10 00000000 ACPI!ReadFieldObj+0xc8 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\object.c @ 642]
0b f791ad1c f7420671 00000000 4556414c 898b9000 ACPI!RunContext+0x122 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\ctxt.c @ 588]
0c f791ad44 f742079a 898b9000 00000000 f743a948 ACPI!InsertReadyQueue+0x155 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\sched.c @ 275]
0d f791ad64 f74133c5 898f73b8 00000000 89981ca0 ACPI!RestartCtxtPassive+0x54 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\sched.c @ 384]
0e f791adac 80d391f0 00000000 00000000 00000000 ACPI!ACPIWorker+0xbf (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\worker.c @ 302]
0f f791addc 80b00d52 f7413306 00000000 00000000 nt!PspSystemThreadStartup+0x2e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ps\create.c @ 2213]
10 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 [d:\srv03rtm\base\ntos\ke\i386\threadbg.asm @ 81]
1: kd> bp f740d29c
1: kd> g
Breakpoint 61 hit
eax=00000103 ebx=00000000 ecx=00000103 edx=00002700 esi=899bf2a8 edi=00000103
eip=f740d29c esp=f791ab40 ebp=f791ab4c iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!IsPciDeviceWorker+0x156:
f740d29c 3bc7 cmp eax,edi

eax=00000103


1: kd> g
Breakpoint 11 hit
eax=00008004 ebx=f743a948 ecx=00008000 edx=80b18958 esi=898b9000 edi=898bae10
eip=f741d852 esp=f791ad04 ebp=f791ad1c iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!RunContext+0x142:
f741d852 e83bceffff call ACPI!AcquireMutex (f741a692)

第三部分:

1: kd> x ACPI!gReadyQueue
f743a928 ACPI!gReadyQueue = struct _ctxtq
1: kd> dx -r1 (*((ACPI!_ctxtq *)0xf743a928))
(*((ACPI!_ctxtq *)0xf743a928)) [Type: _ctxtq]
[+0x000] dwfCtxtQ : 0x2 [Type: unsigned long]
[+0x004] pkthCurrent : 0x89981ca0 [Type: _KTHREAD *]
[+0x008] pctxtCurrent : 0x898b9000 [Type: _ctxt *]
[+0x00c] plistCtxtQ : 0x898f8010 [Type: _List *]
[+0x010] dwmsTimeSliceLength : 0x64 [Type: unsigned long]
[+0x014] dwmsTimeSliceInterval : 0x64 [Type: unsigned long]
[+0x018] pfnPauseCallback : 0x0 [Type: void (__cdecl*)(void *)]
[+0x01c] PauseCBContext : 0x0 [Type: void *]
[+0x020] mutCtxtQ [Type: _mutex]
[+0x028] Timer [Type: _KTIMER]
[+0x050] DpcStartTimeSlice [Type: _KDPC]
[+0x070] DpcExpireTimeSlice [Type: _KDPC]
[+0x090] WorkItem [Type: _WORK_QUEUE_ITEM]
1: kd> dx -r1 ((ACPI!_List *)0x898f8010)
((ACPI!_List *)0x898f8010) : 0x898f8010 [Type: _List *]
[+0x000] plistPrev :0x897dc010[Type: _List *]
[+0x004] plistNext : 0x89903010 [Type: _List *]
1: kd> dx -r1 ((ACPI!_List *)0x897dc010)
((ACPI!_List *)0x897dc010) : 0x897dc010 [Type: _List *]
[+0x000] plistPrev :0x897de010[Type: _List *]
[+0x004] plistNext : 0x898f8010 [Type: _List *]
1: kd> dx -r1 ((ACPI!_List *)0x897de010)
((ACPI!_List *)0x897de010) : 0x897de010 [Type: _List *]
[+0x000] plistPrev :0x897e0010[Type: _List *]
[+0x004] plistNext : 0x897dc010 [Type: _List *]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 21:43:20

岩石图像分割系统源码&数据集分享 [yolov8-seg-C2f-CloAtt等50+全套改进创新点发刊_一键训练教程

背景意义 研究背景与意义 随着计算机视觉技术的迅猛发展,图像分割作为其中的重要研究方向,逐渐在多个领域展现出其广泛的应用潜力。尤其是在地质工程、矿业勘探及环境监测等领域,岩石图像的精准分割对于资源的有效开发和环境保护具有重要意…

作者头像 李华
网站建设 2026/8/24 23:40:38

paperzz 毕业论文:搞定本科论文的智能「通关秘籍」

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertationhttps://www.paperzz.cc/dissertation 当本科毕业论文的 ddl 越来越近,你是否还在对着空白文档发…

作者头像 李华
网站建设 2026/8/27 21:43:22

2026年大模型就业全景:技术演进、核心技能与职业发展指南

随着大语言模型(Large Language Models, LLMs)技术的持续突破,人工智能领域正加速完成从“通用对话工具”到“任务驱动型智能体(Agent)系统”的深度变革 截至2026年,企业对大模型相关人才的需求呈现爆发式…

作者头像 李华
网站建设 2026/8/18 19:45:03

导师推荐!8款AI论文写作软件测评:本科生毕业论文必备

导师推荐!8款AI论文写作软件测评:本科生毕业论文必备 2026年AI论文写作工具测评:为何需要这份权威榜单? 随着人工智能技术的不断发展,AI论文写作工具逐渐成为本科生撰写毕业论文的重要辅助工具。然而,市面上…

作者头像 李华
网站建设 2026/8/19 3:01:00

lvgl v8之led控件使用

void lvgl_led_demo() {lv_obj_t* led1 = lv_led_create(lv_scr_act());lv_obj_align(led1, LV_ALIGN_CENTER, -80

作者头像 李华