技术参考手册: 调度器
调度优先级
XWOS的优先级,用类型 xwpr_t 表示:
上下文
XWOS将上下文分为五种,定义可以参考 上下文类型 , 当前代码的上下文可以通过 xwos_skd_get_context_lc() 获取。
libc的 <tt>errno</tt>
为了兼容libc,XWOS将libc的 errno 实现为每线程独立的私有变量, 可以通过 xwos_skd_get_errno_lc() 获取 errno 的地址。
CPU ID
启动调度
系统启动时,每个CPU都需要调用一次 xwos_skd_start_lc() 启动调度。
抢占
需要注意,关闭多少次抢占,就要打开相同次数的抢占。
中断底半部
当配置 XWOSCFG_SKD_BH 为 1 ,XWOS的某些系统函数运行在中断底半部。 例如定时器任务。
需要注意,关闭多少次中断底半部,就要打开相同次数的中断底半部。
当配置 XWOSCFG_SKD_BH 为 0 ,中断底半部被彻底禁用, xwos_skd_dsbh_lc() 与 xwos_skd_enbh_lc() 不 可被调用。
调度器的暂停与继续
◆ XWOS_THD_LOCAL_DATA_NUM
| #define XWOS_THD_LOCAL_DATA_NUM XWOSDL_THD_LOCAL_DATA_NUM |
XWOS API:线程本地数据指针的数量
在文件 skd.h 第 156 行定义.
◆ xwos_skd_prio_tst_valid()
| static bool xwos_skd_prio_tst_valid |
( |
xwpr_t |
prio | ) |
|
|
inlinestatic |
XWOS API:检查优先级是否有效
- 参数
-
- 返回
- 布尔值
- 返回值
-
- 注解
-
在文件 skd.h 第 169 行定义.
170{
171 return xwosdl_skd_prio_tst_valid(prio);
172}
◆ xwos_skd_start_lc()
| static xwer_t xwos_skd_start_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:启动当前CPU的调度器
- 返回
- 此函数不会返回
- 注解
-
此函数被调用后,调度器将开始调度,上下文(Context)也从 启动 切换为 线程 。 调度器启动后,此函数不会返回。 此函数只能在 xwos_init() 之后被调用。
在文件 skd.h 第 185 行定义.
186{
187 return xwosdl_skd_start_lc();
188}
◆ xwos_skd_get_cpuid_lc()
| static xwid_t xwos_skd_get_cpuid_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:获取当前CPU的ID
- 返回
- 当前CPU的ID
- 注解
-
在文件 skd.h 第 197 行定义.
198{
199 return xwosdl_skd_get_cpuid_lc();
200}
◆ xwos_skd_get_context_lc()
| static void xwos_skd_get_context_lc |
( |
xwsq_t * |
ctxbuf, |
|
|
xwirq_t * |
irqnbuf |
|
) |
| |
|
inlinestatic |
XWOS API:获取当前代码的上下文
- 参数
-
| [out] | ctxbuf | 指向缓冲区的指针,通过此缓冲区返回当前上下文, 返回值 上下文类型 |
| [out] | irqnbuf | 指向缓冲区的指针,通过此缓冲区返回中断号 |
- 注解
-
在文件 skd.h 第 211 行定义.
212{
213 xwosdl_skd_get_context_lc(ctxbuf, irqnbuf);
214}
◆ xwos_skd_get_errno_lc()
| static int * xwos_skd_get_errno_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:获取当前上下文的 errno 的地址
- 返回
errno 的指针
errno 是libc中定义的错误码,XWOS将其定义为每线程独立的私有变量:
- 当上下文为线程时,返回当前线程的
errno
- 当上下文为其他时,返回调度器的
errno - 注解
- 上下文:任意
在文件 skd.h 第 227 行定义.
228{
229 return xwosdl_skd_get_errno_lc();
230}
◆ xwos_skd_dspmpt_lc()
| static void xwos_skd_dspmpt_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:关闭本地CPU调度器的抢占
- 注解
-
在文件 skd.h 第 238 行定义.
239{
240 xwosdl_skd_dspmpt_lc();
241}
◆ xwos_skd_enpmpt_lc()
| static void xwos_skd_enpmpt_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:开启本地CPU调度器的抢占
- 注解
-
在文件 skd.h 第 249 行定义.
250{
251 xwosdl_skd_enpmpt_lc();
252}
◆ xwos_skd_dsbh_lc()
| static void xwos_skd_dsbh_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:关闭本地CPU调度器的中断底半部
- 注解
-
在文件 skd.h 第 260 行定义.
261{
262 xwosdl_skd_dsbh_lc();
263}
◆ xwos_skd_enbh_lc()
| static void xwos_skd_enbh_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:开启本地CPU调度器的中断底半部
- 注解
-
在文件 skd.h 第 271 行定义.
272{
273 xwosdl_skd_enbh_lc();
274}
◆ xwos_skd_continue_lc()
| static xwer_t xwos_skd_continue_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:继续运行本地CPU调度器
- 返回
- 错误码
- 注解
-
继续运行调度器包括几个操作:
- 1. 启动本地CPU的系统定时器;
- 2. 打开本地CPU调度器的中断底半部;
- 3. 打开本地CPU调度器的抢占。
在文件 skd.h 第 288 行定义.
289{
290 return xwosdl_skd_continue_lc();
291}
◆ xwos_skd_pause_lc()
| static xwer_t xwos_skd_pause_lc |
( |
void |
| ) |
|
|
inlinestatic |
XWOS API:暂停本地CPU调度器
- 返回
- 错误码
- 注解
-
暂停调度器包括几个操作:
- 1. 关闭本地CPU调度器的抢占;
- 2. 关闭本地CPU调度器的中断底半部;
- 3. 关闭本地CPU的系统定时器。
在文件 skd.h 第 305 行定义.
306{
307 return xwosdl_skd_pause_lc();
308}