SylixOS 记事本

更新时间:
2024-05-13
下载文档

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.
文档内容是否对您有所帮助?
有帮助
没帮助