[其他ST产品] ST源码分析-st_thread_create - 弦外之音

[复制链接]
 楼主| 9dome猫 发表于 2023-4-21 23:22 | 显示全部楼层
上面的代码有点绕,但实际上就是把 协程 的 links 插进去 全局管理器 _st_this_vp.run_q ,他们都是 _st_clist 结构。 _st_clist 结构 在很多地方都有用到。
 楼主| 9dome猫 发表于 2023-4-21 23:22 | 显示全部楼层
这个 _st_clist 的设计比较精巧,定义如下:

typedef struct _st_clist {
  struct _st_clist *next;
  struct _st_clist *prev;
} _st_clist_t;
 楼主| 9dome猫 发表于 2023-4-21 23:23 | 显示全部楼层
没错,只有一前一后 两个字段。实际上 next 存的是 某个协程的 links 字段的内存地址。因为 _st_thread 内部的字段的内存地址都是连续的,所以根据 links 字段的内存地址 做 offset 就能定位到 _st_thread 的头部的地址。有一个封装好的宏函数 _ST_THREAD_PTR() ,根据 links 的内存地址找到 协程。如下:

#define _ST_THREAD_PTR(_qp)         \
    ((_st_thread_t *)((char *)(_qp) - offsetof(_st_thread_t, links)))
 楼主| 9dome猫 发表于 2023-4-21 23:23 | 显示全部楼层
重新看 回去 st_init() ,st_thread_create 函数实际上就是创建了一个结构体变量 _st_thread_t pthread,这个结构体里面保存了,pthread->start 函数未执行之前的寄存器信息。

st_thread_create 函数分析完毕。
 楼主| 9dome猫 发表于 2023-4-21 23:23 | 显示全部楼层
总结:

1,申请内存,拿出 336 字节 初始为 _st_thread_t 结构,后续这块内存的管理通过 _st_thread_t 结构进行管理,例如 :thread->private_data,thread->stack。
 楼主| 9dome猫 发表于 2023-4-21 23:23 | 显示全部楼层
2,然后用汇编 把寄存器信息保存进去 thread->context (jmp_buf) 。

 楼主| 9dome猫 发表于 2023-4-21 23:23 | 显示全部楼层
其实分析到这里,大家会发现,st_thread_create() 虽然创建了协程,但是并没有开始运行协程。从 lookupdns 程序看来。创建了两个协程,如下:

1,st_thread_create(_st_idle_thread_start,...)

2,st_thread_create(do_resolve,...)

但是这两个函数 _st_idle_thread_start() ,跟 do_resolve() 并没有开始运行。那是什么时候开始运行 呢?在 st_thread_exit() 里面。
 楼主| 9dome猫 发表于 2023-4-21 23:24 | 显示全部楼层
扩展知识:

1,GCC 编译的时候加上-gdwarf-2 和 -g3 编译选项可以打印宏。
Pulitzer 发表于 2024-6-1 07:30 | 显示全部楼层

在信号线中串联小电阻其主要目的是对引脚的保护
童雨竹 发表于 2024-6-1 09:26 | 显示全部楼层

驱动脉冲变压器原边时,
Wordsworth 发表于 2024-6-1 10:29 | 显示全部楼层

并且衡量电阻受温度影响大小的物理量是温度系数
公羊子丹 发表于 2024-6-1 12:25 | 显示全部楼层

开模的话,模具不会塌踏。。
万图 发表于 2024-6-1 13:28 | 显示全部楼层

就导通接地放掉
Uriah 发表于 2024-6-1 14:31 | 显示全部楼层

需要靠近在外部添加一个钳位二极管
帛灿灿 发表于 2024-6-1 16:27 | 显示全部楼层

ESD电压通过接地放掉
Bblythe 发表于 2024-6-1 17:30 | 显示全部楼层

电阻消耗过电压的能量
周半梅 发表于 2024-6-1 19:26 | 显示全部楼层

当电路正常工作时,它处于截止状态(高阻态)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部