工具/软件:TI C/C++编译器
我正在编写操作系统、但我一直在尝试为新任务准备初始堆栈帧。 ARM 的调用惯例规定、某些参数在寄存器 r0-R3上传递(这取决于每个参数的大小)、其他参数在栈上传递。 此外、如果参数是在不同的寄存器上传递的浮点数字、那么这一问题就会变得更加困难。这种惯例使得 create_task 函数难以为新任务准备初始堆栈帧。 是否有办法改变这种情况?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:TI C/C++编译器
我正在编写操作系统、但我一直在尝试为新任务准备初始堆栈帧。 ARM 的调用惯例规定、某些参数在寄存器 r0-R3上传递(这取决于每个参数的大小)、其他参数在栈上传递。 此外、如果参数是在不同的寄存器上传递的浮点数字、那么这一问题就会变得更加困难。这种惯例使得 create_task 函数难以为新任务准备初始堆栈帧。 是否有办法改变这种情况?
感谢您的帮助、考古学家。 我认为您完全理解我的问题。 但是、让我做一些更多的解释来准确地说明我要做的事情。
我想定义一个以更简单的方式创建任务(甚至是具有不同数量和类型参数的任务)的函数。 我认为大多数 RTOS 将参数传递给任务的方式非常奇怪、很难使用。 我知道他们都是出于某种原因采用这一功能 的、但我仍然想尝试另一种方法。
下面是我要做的事情的草稿:
void task1(); void task2(int I); void task3(char c、int i、const char* s); create_task (void* task、size_t params_size、...); int main() { create_task (task1、0); create_task (task2、sizeof (int)、13); create_task (task3、sizeof (char)+ sizeof (int)+ sizeof (char*)、'A'、13、"string"); 返回0; }
您看到了吗? 如果我可以更改任务函数的调用惯例、我将能够准确地定义任务函数、与任何其他 C 函数的操作方式完全相同。 此外、我可以将任何数量和类型的参数传递给该函数。 我只需要通知 create_task 将被压入栈的参数的总大小。 这样、将参数从 create_task 的栈框复制到新创建的任务的栈框会很容易。 我假设是一个调用惯例、在这里我会传递栈上的每个参数。
但您已经说过、我无法更改调用惯例。 所以、我只是提出我的想法、尽管现在我知道不可能实现它。
如果出现以下情况、将会很有趣:
void Task1 (int i、char c)__attribute__((args_in_stack));