ST学习笔记

State Threads(ST)学习笔记一、ST简介ST是一个C语言微线程开源库:http://sourceforge.net/projects/state-threads/微线程最大的好处就是将传统的EDSM(Event Drive State Machine)异步化多路复用编程(epoll/select等)串行化。通过在一个进程内模拟多个微线程并发,使得异步编程像同步一样简单。但
摘要由CSDN通过智能技术生成

State Threads(ST)学习笔记

一、ST简介

ST是一个C语言微线程开源库:http://sourceforge.net/projects/state-threads/

微线程最大的好处就是将传统的EDSM(Event Drive State Machine)异步化多路复用编程(epoll/select等)串行化。通过在一个进程内模拟多个微线程并发,使得异步编程像同步一样简单。但是ST的本质仍然是基于EDSM模型,ST将请求抽象为thread概念,ST的调度器(scheduler)对于用户来说是透明的,不像dispatcher那种将执行状态(execute state)暴露给回调方式。


传统EDSM调度模型


ST调度模型

ST通过setjmp和longjmp来实现微线程调用栈上下文(仅包括寄存器状态)的保存与恢复。而调用栈是通过额外分配堆内存来保存的,并没有与物理进程共享调用栈。

二、ST的栈结构介绍

1. // 栈结构

2. typedef struct _st_stack {

3.   _st_clist_t links;

4.   char *vaddr;                /* Base of stack's allocated memory */

5.   int  vaddr_size;            /* Size of stack's allocated memory */

6.   int  stk_size;              /* Size of usable portion of the stack */

7.   char *stk_bottom;           /* Lowest address of stack's usable portion */

8.   char *stk_top;              /* Highest address of stack's usable portion */

9.   void *sp;                   /* Stack pointer from C's point of view */

10. } _st_stack_t;

11. //线程结构

12. typedef struct _st_thread {

13.   int state;                  /* Thread's state */

14.   int flags;                  /* Thread's flags */

15.   void *(*start)(void *arg);  /* The start function of the thread */

16.   void *arg;                  /* Argument of the start function */

17.   void *retval;               /* Return value of the start function */

18.   _st_stack_t *stack;      /* Info about thread's stack */

19.   _st_clist_t links;          /* For putting on run/sleep/zombie queue */

20.   _st_clist_t wait_links;     /* For putting on mutex/condvar wait queue */

21.   st_utime_t due;             /* Wakeup time when thread is sleeping */

22.   _st_thread_t *left;         /* For putting in timeout heap */

23.   _st_thread_t *right;      /* -- see docs/timeout_heap.txt for details */

24.   int heap_index;

25.   void **private_data;        /* Per thread private data */

26.   _st_cond_t *term;           /* Termination condition variable for join */

27.   jmp_buf context;            /* Thread's context */

28. } st_thread_t;


微线程栈结构图

上图是栈分配后的结果,两边是REDZONE使用mprotect保护不被访问(仅debug模式开启),extra是用于开启随机栈地址空间使用的,随机栈地址开启后会调整bottom和top,就是随机的向右边移动一点。应该是用于防止栈溢出攻击总之,最后使用的,对外提供的接口就是[bottom, top]这个内存区域[bottom, top]区域又进一步分为

ptds:微线程的私有数据private_data,是12个指针(ST_KEYS_MAX指定),参考st_key_create()。

trdst_thread_t结构本身也是在这个stack中分配的。

pad+align:在trd之后是对齐和pad(_ST_STACK_PAD_SIZE指定)。

sp:微线程实际的栈指针。

st_thread_create函数创建微线程时会初始化sp。微线程的分配详情参考_st_stack_new函数

三、重要函数注释

1st_thread_create

1. /* 

2.  * 创建微线程

3.  * @start微线程start函数

4.  * @arg入口函数参数列表

5.  * @joinablejoinable标记

6.  * @stk_size微线程栈大小

7.  */

8. _st_thread_t *st_thread_create(void *(*start)(void *arg), void *arg, int joinable, int stk_size)

9. {

10. _st_thread_t *thread;

11. _st_stack_t *stack;

12. void **ptds;

13. char *sp;

14. 

15. /* 调整线程栈大小 */

16. if (stk_size == 0)

17. /* 如果stk_size0,设置为默认大小 */

18. stk_size = ST_DEFAULT_STACK_SIZE;

19. /* 否则调整栈大小为内存页的整数倍 */

20. stk_size = ((stk_size + _ST_PAGE_SIZE - 1) / _ST_PAGE_SIZE) * _ST_PAGE_SIZE;

21. /* 申请占空间并对栈空间结构初始化,参见微线程栈结构图 */

22. stack = _st_stack_new(stk_size);

23. if (!stack)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用内容,STM32C8T6是一款通用增强型的48脚单片机,具有64K闪存和LQFP封装。它适用于工业级温度范围-40~85度。下面是一些关于STM32C8T6学习笔记: 1. 学习资料:可以从ST官方网站下载STM32C8T6的数据手册和参考手册,这些手册包含了该单片机的详细信息和使用方法。 2. 开发环境:为了开始学习STM32C8T6,你需要安装相应的开发环境。ST官方提供了一款免费的集成开发环境(IDE)——STM32CubeIDE,它可以帮助你进行代码编写、调试和下载。 3. 编程语言:STM32C8T6可以使用多种编程语言进行开发,包括C语言和汇编语言。C语言是最常用的编程语言,它可以通过STM32CubeIDE进行编写和调试。 4. 引脚配置:在使用STM32C8T6之前,你需要了解每个引脚的功能和配置。数据手册中有一张引脚功能表,可以帮助你了解每个引脚的用途和配置方法。 5. 时钟配置:STM32C8T6具有多个时钟源和时钟分频器,你需要根据自己的需求配置正确的时钟。时钟配置对于外设的正常工作非常重要。 6. 中断和定时器:STM32C8T6支持中断和定时器功能,这些功能可以帮助你实现各种任务和功能。你可以通过配置中断和定时器来实现外设的响应和定时操作。 7. 外设驱动:STM32C8T6具有丰富的外设,包括GPIO、UART、SPI、I2C等。你可以根据自己的需求选择合适的外设,并学习如何配置和驱动这些外设。 8. 调试和下载:在开发过程中,你可以使用STM32CubeIDE提供的调试功能来调试你的代码。一旦代码调试完成,你可以使用ST-Link或其他下载器将代码下载到STM32C8T6上运行。 希望以上笔记对你学习STM32C8T6有所帮助!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值