C/Assembler - 在没有堆栈的单用户、单任务操作系统中返回代码

标签 c assembly embedded stack bootloader

我有一个简单的引导加载程序,用于初始化和准备 SDRAM。然后它从 Flash 加载一个应用程序并在 RAM 中的某个地址启动它。应用程序完成执行后,系统会重新启动。没有系统堆栈。

现在,我希望这个引导加载程序在应用程序完成执行后收回控制权。引导加载程序(我们称之为操作系统)还必须读取应用程序的返回码。

应用程序如何向调用操作系统返回值以及调用操作系统如何取回控制权?我想,它可以使用中断来完成——操作系统有一个特殊的常驻函数与一些中断相结合,每个应用程序只是在它自己的执行结束时调用这个中断。但是如果没有系统堆栈,操作系统如何读取返回码?

最佳答案

通常您会在一个或多个寄存器中留下一个返回代码,但由于您可以控制,所以您可以将它留在任何您喜欢的地方!

当应用程序被中断时,中断处理例程需要将应用程序的状态保存在某处,这可能意味着从影子寄存器复制到内存中的预定义位置。

如果应用程序将控制权交还给操作系统(通过软件中断/系统调用),那么您需要定义自己的调用约定,用于放置寄存器参数,并且事件处理程序需要在将控制权交回之前遵循此约定到操作系统。您可能希望调用约定尽可能与您的 c 编译器相匹配,以使您自己轻松一些。

关于C/Assembler - 在没有堆栈的单用户、单任务操作系统中返回代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2048271/

相关文章:

c - getchar() 的行为对于该程序是否正确?

assembly - 我可以通过一些 16 位魔法将其变成循环吗?

performance - Cortex M4 LDR/STR 时序

c - 如何在 sdcc 内联汇编中推送变量?

c++ - 访问内存映射 I/O

c - C99:fscanf()设置eof早于fgetc()的标准做法吗?

c - 我如何获得一个函数来替换数组中 char 的所有实例?

c++ - C/C++ 中最快的 u_int64_t[8] 数组比较

c++ - 你怎么 "Drop down to Assembly"?

python - Python依赖于哪些内核服务?