裸机与 API。有什么不同?

Rag*_*gha 1 c embedded

我最近开始学习嵌入式 C,并一直在使用基于 ARM 的 FRDMKL25Z 微控制器。现在,为了使用开关连接 LED,我遇到了两种类型的编码方法:

裸机:

while(1) {
    if(GPIO_D->PDIR & (1<<4)) {
        /* Make the LED as OFF */
        GPIO_C->PSOR = (1 << 8);
    }
    else {
        /* Make the LED as ON */
        GPIO_C->PCOR = (1 << 8);
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序编程接口:

while(1) {
    if(GPIO_ReadPinInput(GPIOA, 12)) {
        GPIO_SetPinsOutput(GPIOC, (1<<9));
    }
    else {
        GPIO_ClearPinsOutput(GPIOC, (1 << 9));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这两个代码都做完全相同的事情,但是它们之间有什么区别,哪一个更好呢?

小智 5

抽象。如果两个片段都做同样的事情(我只是在这里假设,因为我不知道 GPIO 函数的实现是什么以及寄存器的描述是什么),那么我会说它们之间的唯一区别是一个更具可读性比另一个。
想象一下打开一个新项目并发现GPIO_C->PSOR. 您必须找到包含此寄存器信息的文档并查看它的作用。大多数开发人员不需要/关心这类东西(尽管他们应该知道如何去做),因此建议使用一个涵盖所有“低级”部分的抽象层。因此,对于从事“更高级别”(驱动程序、应用程序)工作的人员来说,这是加快速度的好方法
,而且,这是避免错误的好方法。