gpt4 book ai didi

c - 如何为 ARM 上的每个任务定义堆栈

转载 作者:行者123 更新时间:2023-11-30 14:20:50 25 4
gpt4 key购买 nike

今天我遇到了一个小问题,我认为起源是关于堆栈的。

这是我的问题:

我声明了三个用户任务,如下所示:

void task1Function(void) {
print_uart0("-usertask : First task is started...\r\n");
while(1){
//syscall(1);
}
}

void task2Function(void) {
print_uart0("-usertask : Second task is running...\r\n");
//syscall(); /* To return in the kernel's mode */
while(1){

}
}

void task3Function(void) {
print_uart0("-usertask : Third task is running...\r\n");
//syscall(); /* To return in the kernel's mode */
while(1){

}
}

我有一个包含三个任务的数组,其结构如下:

typedef struct
{

unsigned int *sp;
unsigned int registers[12];
unsigned int lr;
unsigned int pc;
unsigned int cpsr;
unsigned int mode;
unsigned int num;
void *stack;
int stacksize;

int priority;
int state; /* Running, Ready, Waiting, Suspended */

/* Next and previous task in the queue */
struct taskstruct *qnext, *qprev;
}taskstruct;

这是我的任务的初始化:

void init_task(taskstruct * task, void (*function)(void) ){
task->sp = (unsigned int*)&function;
task->registers[0] = 0; // r0
task->registers[1] = 0; // r1
task->registers[2] = 0; // r2
task->registers[3] = 0; // r3
task->registers[4] = 0; // r4
task->registers[5] = 0; // r5
task->registers[6] = 0; // r6
task->registers[7] = 0; // r7
task->registers[8] = 0; // r8
task->registers[9] = 0; // r9
task->registers[10] = 0; // r10
task->registers[11] = 0; // r11
task->registers[12] = 0; // r12
task->lr = 0;
task->pc = 0;
task->cpsr = 0;
task->mode = 0x10;
}

init_task(&task[0],&task1Function);
init_task(&task[1],&task2Function);
init_task(&task[2],&task3Function);

但是当我将任务[0].sp传递给我的激活函数时,它始终是最后一个声明的启动任务(即第三个):

.global activate
activate:

LDR r12, [r0]
/*STMFD sp!,{r1-r11,lr}*/
NOP

msr CPSR_c, #0x10 /* User mode with IRQ enabled and FIQ disabled*/
mov pc, r12

所以我想我的用户堆栈有问题,我必须为每个用户设置不同的堆栈,对吗?在这种情况下,有人可以告诉我如何继续吗?

问候,文森特

最佳答案

是的,你说得对。

每个任务必须有单独的堆栈,因为堆栈的状态是任务总状态的一部分。

你可以添加类似的内容

uint32_t stack[512];

到您的taskstruct,然后在切换任务时相应地设置/恢复任务指针。在这种情况下很难提供足够的细节。

关于c - 如何为 ARM 上的每个任务定义堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15090840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com