OSTaskDel ((OS_TCB *)0,&err);

在UCOSIII中 OSTaskDel ((OS_TCB   *)0,&err);是删除自身任务的语句。在写程序时必须将你想执行的任务放在这个语句之前,他是一个立即执行的一个语句,并不是在这个任务中的全部语句执行完成再进行删除任务
 

void tast()
{
a=1;

OSTaskDel ((OS_TCB   *)0,&err);

Calculate_finish=1;

}

如果按照上述顺序写代码,Calculate_finish=1将无法执行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是代码实现: ```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”选项来启动虚拟逻辑分析仪。通过该工具,我们可以获取每个线程的运行状态并进行分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值