嵌入式C编程语言中的Super Loop是什么?
嵌入式C编程语言中的Super Loop是什么?
这指的是通常位于“裸机”系统(没有操作系统)的main()
函数中的无限循环,因为这样的系统永远无法从主函数返回。一个典型的裸机嵌入式系统看起来像这样:
void main (void)
{
// various initializations
for(;;) // "super loop" or "main loop"
{
// do stuff
}
}
MCU是一种设备,当电源开启时会持续运行或执行指令(通常情况下)。
因此,使用while循环可以强制MCU执行某些操作,即使循环为空,它也会一直循环执行。
但是它必须做一些事情,因为它不同于PC程序,在主函数末尾有“return”语句。
如果没有“超级循环”,那么MCU可能会从FLASH/RAM(随便哪个..)获取指令并执行一些愚蠢的操作,因为MCU不知道它正在执行什么。它只会执行您提供给它的代码。
通过使用超级循环,您可以确保MCU不会无法控制地执行一些指令,可能会进入故障安全区域。当然,即使您有超级循环,这种情况也可能发生,但这是另一个话题。
int main() {
//Init if you have something
while (1) {
//DO stuff always
}
return 0; //This should never happen!
}
int main()
对于大多数编译器来说是不正确的形式的原因。大多数编译器(例如gcc)在编译自由系统时使用void main(void)
。 - Lundinint main
不是错误的做法。大多数编译器都知道(即使 gcc 也很聪明),如果你在没有返回语句的情况下使用 int main
,它不会给出警告。 - ringbuffer_peekvoid main
时,在GCC中会收到警告*Return type of main is not int [-Wmain]*。 - ringbuffer_peek-ffreestanding
选项。总的来说,在主函数格式方面,对程序员进行了大量洗脑。就标准而言,该格式实际上非常灵活。https://dev59.com/7HVC5IYBdhLWcg3wtzkQ#31263079 - Lundin超级循环是一个无限循环,仅适用于嵌入式C编程,因为您必须长时间运行代码,并希望在机器人或其他设备的行为发生变化时明确终止。
超级循环就像这样while(1){
// Your code
// exit condition
}
for(;;) {
}
超级循环(或超级循环)是嵌入式实时固件开发人员经常选择的设计模式,特别适用于非常小的系统(尤其是“裸机”系统),其中简单性是重要的设计目标。
超级循环(“超级”在拉丁语中意为“以上”)是程序的顶层循环。一个特别简单的实现可能看起来像这样:
int main() {
initializeGlobalState();
while (1) {
sampleInputs();
updateGlobalStateBasedOnNewInputs();
updateOutputs();
}
// can't ever get here but the compiler may require a `return` statement.
return 0;
}
简单是目标,但模式允许小的复杂性。例如,可以实现一个基本的优先级方案:
initializeGlobalState();
while (1) {
sampleHighPriorityInputs();
if (updateStateBasedOnNewHighPriorityInputs()) {
updateOutputs();
continue;
}
sampleOtherInputs();
updateGlobalStateBasedOnNewOtherInputs();
updateOutputs();
}
可以进行调度:
initializeGlobalState();
while (1) {
timeNow=readFreeRunningTimer();
sampleInputs();
updateGlobalState();
if (timeNow > task1_dueDate) {
doTask1();
task1_dueDate += task1_fixedPeriod;
}
if (timeNow > task2_dueDate) {
doTask2();
task2_dueDate = computeTask2DueDateBasedOnGlobalStateOrInputs();
}
...
updateOutputs();
}
可以通过减缓速度来节省电力:
initializeGlobalState();
enableHeartbeatInterrupt();
while (1) {
...
WAIT_FOR_INTERRUPT;
}
还有可能出现其他的复杂情况,但超级循环的缺点是,如果您尝试添加太多的超级循环,它会变得笨重而脆弱。当这种情况发生时,开发人员可能会希望他们已经在实时操作系统和/或应用程序框架上构建了该项目。
if ((uint8_t)(cur_tick_ms - last_print_time_ms) >= 100) { printf("Print time! curr_tick_ms = %i\n", cur_tick_ms);
last_print_time_ms = cur_tick_ms;}``