利用RT-Thead,在keil软件环境下,设计三个线程,其中线程thread1动态创建,而线程thread2和Thread Flag3是静态创建,thread1的优先级为25,thread2的优先级为24,Thread Flag3的优先级高于thread1;优先级较高的thread2抢占低优先级的 thread1,执行完毕一段程序后自动被系统脱离; 而优先级较低的thread1被设计成死循环,循环中有让出CPU使用权的动作 - 使用了delay函数,该线程在thread2退出运行之后开始运行,每隔段时间运行一次,并一直循环运行下去;Thread Flag3实现一个周期方波,周期为10个OSTicks,要求在thread1和thread2中添加代码,并且能够在keil软件仿真中设置虚拟逻辑分析仪得到这两个线程的状态
时间: 2023-08-16 20:06:04 浏览: 115
好的,以下是代码实现:
```c
#include "stm32f10x.h"
#include "os.h"
#define STACK_SIZE 256
OS_TCB tcb1;
OS_TCB tcb2;
OS_TCB tcb3;
CPU_STK stack1[STACK_SIZE];
CPU_STK stack2[STACK_SIZE];
CPU_STK stack3[STACK_SIZE];
OS_FLAG_GRP* flag_group;
OS_SEM sem1;
void thread1(void* pdata);
void thread2(void* pdata);
void thread3(void* pdata);
int main() {
OS_ERR err;
OSInit(&err);
flag_group = OSFlagCreate(0, &err);
OSTaskCreate(&tcb1, "Thread 1", thread1, NULL, 25, &stack1[0], STACK_SIZE / 10, STACK_SIZE, 0, 0, NULL, OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, &err);
OSTaskCreate(&tcb2, "Thread 2", thread2, NULL, 24, &stack2[0], STACK_SIZE / 10, STACK_SIZE, 0, 0, NULL, OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, &err);
OSTaskCreateStatic(&tcb3, "Thread Flag3", thread3, NULL, 26, &stack3[0], STACK_SIZE / 10, STACK_SIZE, 0, 0, NULL, OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, &err);
sem1 = OSSemCreate(0, &err);
OSStart(&err);
}
void thread1(void* pdata) {
OS_ERR err;
while (1) {
OSSemPend(&sem1, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
while (1) {
GPIO_SetBits(GPIOB, GPIO_Pin_0);
OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
}
void thread2(void* pdata) {
OS_ERR err;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
while (1) {
GPIO_SetBits(GPIOB, GPIO_Pin_1);
OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
OSFlagPost(flag_group, 0x01, OS_OPT_POST_FLAG_SET, &err);
OSTimeDlyHMSM(0, 0, 9, 0, OS_OPT_TIME_HMSM_STRICT, &err);
OSTaskDel(OS_PRIO_SELF, &err);
}
}
void thread3(void* pdata) {
OS_ERR err;
while (1) {
OSFlagPend(flag_group, 0x01, OS_OPT_PEND_FLAG_SET_ALL + OS_OPT_PEND_FLAG_CONSUME, 0, &err);
GPIO_SetBits(GPIOB, GPIO_Pin_2);
OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err);
GPIO_ResetBits(GPIOB, GPIO_Pin_2);
}
}
```
在该代码中,我们使用了STM32F10x控制器来实现线程的设计。thread1使用了一个死循环,等待thread2退出后开始运行,并循环地每隔一段时间运行一次。thread2使用了一个较高的优先级,抢占低优先级的thread1,并在执行完一段程序后自动被系统脱离。thread3实现了一个周期为10个OSTicks的方波,同时具有比thread1更高的优先级。我们还使用了OSFlag和OSSemaphore来协调线程之间的同步与互斥。
在keil软件仿真中,我们可以设置虚拟逻辑分析仪来获取线程的状态。需要使用CMSIS-DAP工具来连接STM32控制器,并在仿真之前将STM32控制器与CMSIS-DAP连接。在仿真时,可以通过“Debug”菜单中的“Start/Stop Logic Analyzer”选项来启动虚拟逻辑分析仪。通过该工具,我们可以获取每个线程的运行状态并进行分析。
阅读全文