SylixOS 记事本
SylixOS 系统中有一个与线程相关的特性称为线程记事本,它允许开发者在线程上下文中存储自定义数据。这个功能可以用于记录线程执行过程中的关键状态、调试信息或者其他需要跟踪的数据。
在 SylixOS 系统中,通过特定的接口函数可以实现线程记事本的操作。
设置线程记事本
#include <SylixOS.h>
ULONG Lw_Thread_SetNotePad(LW_OBJECT_HANDLE ulId,
UINT8 ucNoteIndex,
ULONG ulVal);
函数 Lw_Thread_SetNotePad 原型分析:
- 此函数成功时返回 ERROR_NONE,失败时返回错误号。
- 参数 ulId 是线程ID。
- 参数 ucNoteIndex 是线程记事本索引,该值系统默认最大为 3,修改系统配置最大可为 254。
- 参数 ulVal 是线程记事本值。
获取线程记事本
#include <SylixOS.h>
ULONG Lw_Thread_GetNotePad(LW_OBJECT_HANDLE ulId,
UINT8 ucNoteIndex);
函数 Lw_Thread_GetNotePad 原型分析:
- 此函数成功时返回线程记事本值,失败时返回 0。
- 参数 ulId 是线程ID。
- 参数 ucNoteIndex 是线程记事本索引,该值系统默认最大为 3,修改系统配置最大可为 254。
#include <SylixOS.h>
ULONG Lw_Thread_CurNotePad(UINT8 ucNoteIndex);
函数 Lw_Thread_CurNotePad 原型分析:
- 此函数成功时返回当前线程记事本值,失败时返回 0。
- 参数 ucNoteIndex 是线程记事本索引,该值系统默认最大为 3,修改系统配置最大可为 254。
#include <SylixOS.h>
ULONG Lw_Thread_FastNotePad(UINT8 ucNoteIndex);
函数 Lw_Thread_CurNotePad 原型分析:
- 此函数成功时返回当前线程记事本值,失败时返回 0。
- 参数 ucNoteIndex 是线程记事本索引,该值系统默认最大为 3,修改系统配置最大可为 254。
Lw_Thread_FastNotePad 函数相较于 Lw_Thread_CurNotePad 函数,去除了参数有效性检测,效率会更高,但严禁在异常状态调用,仅支持在多任务状态下调用。
下面程序展示了 SylixOS 线程记事本的使用,程序创建一个线程 A,在线程 A 中创建线程 B 并在线程 B 的记事本中记录线程 A 的句柄,并在线程 B 中读出线程 A 的句柄。
#include "SylixOS.h"
/*********************************************************************************************************
全局变量定义
*********************************************************************************************************/
static ULONG _G_ulVal = 0;
/*********************************************************************************************************
** 函数名称: tTestB
** 功能描述: 线程函数
** 输 入 : pvArg 传入的参数
** 输 出 : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static PVOID tTestB (PVOID pvArg)
{
ULONG ulVal;
ulVal = Lw_Thread_GetNotePad(API_ThreadIdSelf(), 0);
if (ulVal == 0) {
printf("t_testb get notepad failed.\n");
} else {
printf("t_testb get notepad success, index[0] is %ld.\n", ulVal);
}
ulVal = Lw_Thread_CurNotePad(1);
if (ulVal == 0) {
printf("t_testb get notepad failed.\n");
} else {
printf("t_testb get notepad success, index[1] is %ld.\n", ulVal);
}
ulVal = Lw_Thread_FastNotePad(2);
if (ulVal == 0) {
printf("t_testb get notepad failed.\n");
} else {
printf("t_testb get notepad success, index[2] is %ld.\n", ulVal);
}
return (LW_NULL);
}
/*********************************************************************************************************
** 函数名称: tTestA
** 功能描述: 线程函数
** 输 入 : pvArg 传入的参数
** 输 出 : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static PVOID tTestA (PVOID pvArg)
{
INT iError = -1;
LW_HANDLE hThreadBId;
hThreadBId = Lw_Thread_Create("t_testb", tTestB, LW_NULL, LW_NULL);
if (hThreadBId == LW_OBJECT_HANDLE_INVALID) {
printf("t_testa create failed.\n");
}
_G_ulVal = API_ThreadIdSelf();
/*
* 在线程 B 的记事本 0 处写入 _G_ulVal 值
*/
iError = Lw_Thread_SetNotePad(hThreadBId, 0, _G_ulVal);
if (iError != ERROR_NONE) {
printf("t_testa set notepad index0 failed.\n");
}
iError = Lw_Thread_SetNotePad(hThreadBId, 1, _G_ulVal + 1);
if (iError != ERROR_NONE) {
printf("t_testa set notepad index1 failed.\n");
}
iError = Lw_Thread_SetNotePad(hThreadBId, 2, _G_ulVal + 2);
if (iError != ERROR_NONE) {
printf("t_testa set notepad index2 failed.\n");
}
Lw_Thread_Join(hThreadBId, LW_NULL);
return (LW_NULL);
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数
** 输 入 : argc,argv
** 输 出 : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
int main (int argc, char *argv[])
{
LW_HANDLE hThreadAId;
hThreadAId = Lw_Thread_Create("t_testa", tTestA, LW_NULL, LW_NULL);
if (hThreadAId == LW_OBJECT_HANDLE_INVALID) {
printf("t_testa create failed.\n");
return (-1);
}
Lw_Thread_Join(hThreadAId, LW_NULL);
return (0);
}
/*********************************************************************************************************
END
*********************************************************************************************************/
在 SylixOS Shell 下运行程序:
# ./Thread_Notepad
t_testb get notepad success, index[0] is 67109061.
t_testb get notepad success, index[1] is 67109062.
t_testb get notepad success, index[2] is 67109063.