学会使用PendSV中断进行压栈和出栈操作,是实现任务调度的关键。今天我们就来学习一下如何使用不超过20行的汇编实现压栈和出栈操作。
我们现在来实现这么一个例子:先把R4-R11通用寄存器的值保存到一个缓冲区里面,然后再把缓冲区里面的值恢复到R4-R11。
实现这个功能的意义在于,在切换一下个任务之前,要先把当前任务的状态先保存起来,然后把要下面要执行的任务状态从缓冲区里面恢复出来。
下面我们就要上一次创建的工程上进行本次实例的讲解
首先,我们先定义一个结构体:
typedef uint32_t StackType_t;
typedef struct tskTaskControlBlock
{
StackType_t *pxTopOfStack;
}TCB_t;
然后定义一个结构体变量以及结构体指针:
TCB_t *pxCurrentTCB;
TCB_t CurrentTCB;
接下来,我们要对PendSV相关的寄存器进行定义和定义一个写寄存器操作:
#define NVIC_INT_CTRL 0xE000ED22
#define portNVIC_INT_CTRL_REG 0xE000ED04
#define portNVIC_PENDSVSET_BIT 0x10000000
#define portNVIC_PENDSVSET_PRI 0xFF
#define REG_WRITE_32(ADDRESS) (*(volatile unsigned long *)(ADDRESS))
#define REG_WRITE_8(ADDRESS) (*(volatile unsigned char *)(A