1、线程的五种状态
初始状态、就绪状态、运行状态、挂起状态、关闭状态
2、RT-thred的启动工作:
通过rtthread_startup启动函数,它会初始化启动内核对象,如定时器、调度器、信号。
另外,它的main线程,也会对各类模块进行初始化,同时初始化空闲线程。
3、静态对象与动态对象的特点
静态对象在RW段和ZI段,编译时分配内存空间的对象
动态对象在内存堆中创建的,运行时分配内存空间的对象
4、对象容器与对象列表
对象容器是一种数据结构,用于存储和管理系统中的各个对象,比如线程、信号量、互斥量。
对象列表是对象容器的一种具体体现,用于存储统一对象类型的接口
5、线程间同步的作用
是指在多个线程环境中控制多个线程按照一定的顺序执行或者共享资源的机制。
作用是:避免竞态条件、保护共享资源、确保线程执行顺序。
6、信号量与互斥量的异同:
信号量与互斥量都是用于线程间同步和资源共享的机制。区别在于:
信号量是一种计数器,用于控制对资源的访问,可以有多个线程同时访问资源,只要计数量不为零。
互斥量是一种二进制信号量,用于保护对一个资源的独占访问,同一时刻只能有一个线程访问资源。
7、消息队列机制原理和操作方法
消息队列是线程之间通信和数据传输的机制,将数据以消息的形式存储在队列中,按照FIFO的顺序从队列中获取信息
操作方法包括:创建消息队列、发送信息、接收信息、删除消息队列。
5.设某线程入口函数为static void th_entry (void *par),声明的静态线程变量为static struct rt_thread th1;要求写出使用线程变量th1调用函数th_entry()的过程。
// 声明线程入口函数
static void th_entry(void *par);
// 声明静态线程变量
static struct rt_thread th1;
// 在某处初始化线程th1
void init_thread() {
rt_thread_init(&th1, "Thread1", th_entry, NULL, ...); // 初始化线程th1
rt_thread_startup(&th1); // 启动线程th1
}
// 线程入口函数
static void th_entry(void *par) {
// 线程执行的代码
}
6.设定时器溢出函数为static void myTimer_entry (void *par), 使用动态定时器变量rt_timer_t myTimer, 设计一个周期为100个时间节拍的软定时器并启动定时器。
#include <rtthread.h>
// 定时器溢出函数
static void myTimer_entry(void *param) {
// 定时器溢出时执行的操作
}
// 在某处创建并启动软定时器
void start_timer() {
// 创建定时器
rt_timer_t myTimer = rt_timer_create("MyTimer", myTimer_entry, NULL, 100, RT_TIMER_FLAG_ONE_SHOT);
if (myTimer != RT_NULL) {
// 启动定时器
rt_timer_start(myTimer);
}
}
9.简要描述使用互斥量同步公共资源使用的过程。 (所谓的“同步公共资源的使用”就是对某公共变量commVar而言,任一时刻最多只能有一个线程可以改变commVar的状态,因此可以定义访问commVar的规则就是“首先活动使用commVar的许可(获得互斥量),然后更改commVar值,再释放commVar的使用权(即释放互斥量)”。把这规则用程序语言描述出来。)
#include <rtthread.h>
// 定义公共变量
int commVar = 0;
// 定义互斥量
static struct rt_mutex mutex;
// 初始化互斥量
void init_mutex() {
rt_mutex_init(&mutex, "CommVarMutex", RT_IPC_FLAG_PRIO);
}
// 线程1修改公共变量的函数
void modify_commVar_thread(void *param) {
// 获取互斥量的许可
rt_mutex_take(&mutex, RT_WAITING_FOREVER);
// 修改公共变量的值
commVar = 10;
// 释放互斥量的许可
rt_mutex_release(&mutex);
}
// 线程2读取公共变量的函数
void read_commVar_thread(void *param) {
// 获取互斥量的许可
rt_mutex_take(&mutex, RT_WAITING_FOREVER);
// 读取公共变量的值
int value = commVar;
// 释放互斥量的许可
rt_mutex_release(&mutex);
}
10.假设某同学学号和姓名分别是:int xuehao=0x12345678; char name[]=”My Seig”;要求: (1)使用邮箱将该同学学号和姓名发送出去; (2)接收邮件,并将内容显示出来。
#include <rtthread.h>
// 学号和姓名
int xuehao = 0x12345678;
char name[] = "My Seig";
// 定义邮箱
static struct rt_mailbox mailbox;
// 初始化邮箱
void init_mailbox() {
rt_mb_init(&mailbox, "StudentInfoMailbox", sizeof(int) + sizeof(name), 10, RT_IPC_FLAG_FIFO);
}
// 发送学号和姓名的函数
void send_info_thread(void *param) {
// 发送学号和姓名到邮箱
rt_mb_send(&mailbox, &xuehao, sizeof(int));
rt_mb_send(&mailbox, name, sizeof(name));
}
// 接收邮件并显示内容的函数
void receive_info_thread(void *param) {
int received_xuehao;
char received_name[sizeof(name)];
// 从邮箱接收学号和姓名
rt_mb_recv(&mailbox, &received_xuehao, sizeof(int), RT_WAITING_FOREVER);
rt_mb_recv(&mailbox, received_name, sizeof(name), RT_WAITING_FOREVER);
// 显示学号和姓名
rt_kprintf("学号:%x\n", received_xuehao);
rt_kprintf("姓名:%s\n", received_name);
}