注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
乔海权的个人空间 https://home.eeworld.com.cn/space-uid-448784.html [收藏] [复制] [分享] [RSS]
日志

RT-studio 创建任务 学习(1)

已有 407 次阅读2023-6-13 18:00 |个人分类:RT-thread

创建任务

1. 先搞个任务的栈,ID值

 

static rt_uint8_t thread_stack[512];
struct rt_thread at_task_id = {0};

 

2. 在 hal_entry.c 里面创建任务, at_task_handler 是个函数指针,就感觉离谱叫函数指针

void hal_entry(void)
{
    rt_kprintf("\nHello RT-Thread!\n");

    // 创建任务1
    rt_thread_init(&at_task_id, "at_task", at_task_handler, RT_NULL, thread_stack, 512, 25, 5);
    rt_thread_startup(&at_task_id);

    while (1)
    {
        rt_thread_mdelay(500);
    }
}

 

3. 任务的执行函数

void at_task_handler(void *param)
{
    while(1)
    {
        rt_pin_write(LED_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }
}

 

4. 以上就是添加新任务的功能

 

5.  创建一个任务做了什么,大致找了一下,跟任务相关的数据放在这个结构体里面

struct rt_thread at_task_id = {0};

阅读代码

struct rt_thread
{
    /* rt object */
#if RT_NAME_MAX > 0
    char        name[RT_NAME_MAX];                      // 内核组件的名字,内核组件包括 线程,信号量,队列等
#else
    const char *name;                                   /**< static name of kernel object */
#endif /* RT_NAME_MAX > 0 */
    rt_uint8_t  type;                                  // 内核组件的类型
    rt_uint8_t  flags;                                  // 内核组件的标志位

 

    rt_list_t   list;                                  //组件列表
    rt_list_t   tlist;                                 // 线程列表

    /* stack point and entry */
    void       *sp;                                     // 栈指针
    void       *entry;                                  // 线程的实际运行函数
    void       *parameter;                              // 线程参数
    void       *stack_addr;                            //栈地址
    rt_uint32_t stack_size;                             // 栈大小

    /* error code */
    rt_err_t    error;                                  /**< error code */

    rt_uint8_t  stat;                                   //线程状态

 

    /* priority */
    rt_uint8_t  current_priority;                       /**< current priority */ //当前优先级
    rt_uint8_t  init_priority;                          /**< initialized priority */ // 初始化的优先级

    rt_uint32_t number_mask;                            /**< priority number mask */ //优先级掩码

#ifdef RT_USING_MUTEX  // 如果使用互斥锁
    /* object for IPC */
    rt_list_t taken_object_list;
    rt_object_t pending_object;
#endif

#ifdef RT_USING_EVENT  //如果使用事件
    /* thread event */
    rt_uint32_t event_set;
    rt_uint8_t  event_info;
#endif /* RT_USING_EVENT */

#ifdef RT_USING_SIGNALS //如果使用信号量
    rt_sigset_t     sig_pending;                        /**< the pending signals */
    rt_sigset_t     sig_mask;                           /**< the mask bits of signal */

#ifndef RT_USING_SMP
    void            *sig_ret;                           /**< the return stack pointer from signal */
#endif /* RT_USING_SMP */
    rt_sighandler_t *sig_vectors;                       /**< vectors of signal handler */
    void            *si_list;                           /**< the signal infor list */
#endif /* RT_USING_SIGNALS */

 

 

    rt_ubase_t  init_tick;                              /**< thread's initialized tick */ // 线程初始的时间线
    rt_ubase_t  remaining_tick;                         /**< remaining tick */

    struct rt_timer thread_timer;                       /**< built-in thread timer */  //定时器相关

    void (*cleanup)(struct rt_thread *tid);             /**< cleanup function when thread exit */ //任务退出时的清除函数

 

    /* light weight process if present */

    rt_ubase_t user_data;                             /**< private user data beyond this thread */
};
typedef struct rt_thread *rt_thread_t;

 

 

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章