📜  TSSN-存储程序控制(1)

📅  最后修改于: 2023-12-03 15:20:41.201000             🧑  作者: Mango

TSSN-存储程序控制

TSSN(Task-switched Stack Navigator)是一种存储程序控制技术,用于管理程序控制和数据存储。TSSN将程序控制分解成一个个任务,每个任务都维护了自己的运行栈和数据区。通过不同任务之间的切换和参数传递,实现了程序控制的高度分离和灵活性。

基本概念
  • 任务(Task):TSSN将程序划分成多个任务,每个任务对应着一段具有独立作用的程序逻辑。任务之间通过栈保存运行状态和参数,实现了高度分离和灵活性。
  • 栈(Stack):每个任务都有自己的运行栈,用于保存程序计数器、函数调用参数等信息。栈的大小、位置和生命周期都是由任务自己管理的。
  • 上下文(Context):每个任务都有自己的上下文,包含了任务的运行状态和数据存储区。TSSN通过保存和恢复上下文实现了任务之间的切换。
  • 切换(Switch):TSSN通过保存和恢复任务上下文实现任务之间的切换。切换可以是任务主动切换,也可以是中断(例如信号、IO)导致的切换。
基本用法
定义任务

一个TSSN程序由多个任务组成,可以通过tssn_task_struct结构体定义任务。

struct tssn_task_struct {
    char name[TSSN_TASK_NAME_SIZE];
    uint32_t stack_size;
    tssn_entry_t entry;
    void *arg;
    void *stack;
#if TSSN_ENABLE_CALLCC
    tssn_continuation_t *continuation;
#endif
};

其中,name是任务的名字(用于调试和输出),stack_size是任务的栈大小,entry是任务入口函数,arg是任务入口函数参数,stack是任务栈指针,continuation是协程恢复点(可选)。

初始化TSSN

在使用TSSN之前,需要初始化TSSN。

int tssn_init(void);
创建任务

可以通过tssn_create_task函数创建任务,并指定任务的入口函数和参数。

int tssn_create_task(tssn_task_t *task, const tssn_task_struct_t *task_struct);
启动TSSN

可以通过tssn_start函数启动TSSN。调用该函数将启动TSSN任务调度器,开始执行任务。

int tssn_start(void);
停止TSSN

可以通过tssn_stop函数停止TSSN。调用该函数将停止执行任务,并释放所有资源。

int tssn_stop(void);
切换任务

可以通过tssn_schedule函数切换任务。调用该函数将保存当前任务上下文,恢复下一个任务的上下文,并开始执行下一个任务。注意,tssn_schedule函数必须在任务上下文中调用,否则会导致未定义行为。

void tssn_schedule(void);
退出任务

可以通过tssn_exit函数退出当前任务。调用该函数将保存当前任务上下文,回收任务资源,并切换到下一个任务。

void tssn_exit(void);
获取当前任务

可以通过tssn_current_task函数获取当前正在执行的任务。

tssn_task_t *tssn_current_task(void);
总结

TSSN是一种存储程序控制技术,通过将程序划分成多个任务,并在任务之间保存和恢复运行状态和数据区,实现了程序控制的高度分离和灵活性。TSSN可以应用于各种场景,如多线程调度、协程等。