|
创建任务
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;