阅读"野火的《从0到1教你写uCOS-III内核.pdf》"笔记

这篇博客详细介绍了在uCOS-III内核中任务的定义、任务切换、时间片运行、阻塞延时、空闲任务、时间戳、临界段、就绪列表、多优先级、时基列表和时间片的实现。通过代码示例和实验现象,深入解析了操作系统内核的关键概念。

第5章 任务的定义与任务切换的实现

具体代码可以查看配套的示例代码,只摘取部分代码。

/*
************************************************************************************************************************
*                                                    main函数
************************************************************************************************************************
*/
/*
* 注意事项:1、该工程使用软件仿真,debug需选择 Ude Simulator
*           2、在Target选项卡里面把晶振Xtal(Mhz)的值改为25,默认是12,
*              改成25是为了跟system_ARMCM3.c中定义的__SYSTEM_CLOCK相同,确保仿真的时候时钟一致
*/
int main(void)
{
   
   	
	OS_ERR err;
	
	
	
	/* 初始化相关的全局变量 */
	OSInit(&err);
	
	/* 创建任务 */
	OSTaskCreate ((OS_TCB*)      &Task1TCB, 
	              (OS_TASK_PTR ) Task1, 
	              (void *)       0,
	              (CPU_STK*)     &Task1Stk[0],
	              (CPU_STK_SIZE) TASK1_STK_SIZE,
	              (OS_ERR *)     &err);

	OSTaskCreate ((OS_TCB*)      &Task2TCB, 
	              (OS_TASK_PTR ) Task2, 
	              (void *)       0,
	              (CPU_STK*)     &Task2Stk[0],
	              (CPU_STK_SIZE) TASK2_STK_SIZE,
	              (OS_ERR *)     &err);
				  
	/* 将任务加入到就绪列表 */
	OSRdyList[0].HeadPtr = &Task1TCB;
	OSRdyList[1].HeadPtr = &Task2TCB;
	
	/* 启动OS,将不再返回 */				
	OSStart(&err);
}

/*
************************************************************************************************************************
*                                                    函数实现
************************************************************************************************************************
*/
/* 软件延时 */
void delay (uint32_t count)
{
   
   
	for(; count!=0; count--);
}



/* 任务1 */
void Task1( void *p_arg )
{
   
   
	for( ;; )
	{
   
   
		flag1 = 1;
		delay( 100 );		
		flag1 = 0;
		delay( 100 );
		
		/* 任务切换,这里是手动切换 */		
		OSSched();
	}
}

/* 任务2 */
void Task2( void *p_arg )
{
   
   
	for( ;; )
	{
   
   
		flag2 = 1;
		delay( 100 );		
		flag2 = 0;
		delay( 100 );
		
		/* 任务切换,这里是手动切换 */
		OSSched();
	}
}

main函数开始运行之后在OSStart(&err)函数进行任务切换到Task1,运行到OSSched()时进行任务切换到Task2,就这样不停的切换,具体效果如下图:在这里插入图片描述

第6章 任务时间片运行

具体代码可以查看配套的示例代码,只摘取部分代码。

/*
************************************************************************************************************************
*                                                    main函数
************************************************************************************************************************
*/
/*
* 注意事项:1、该工程使用软件仿真,debug需选择 Ude Simulator
*           2、在Target选项卡里面把晶振Xtal(Mhz)的值改为25,默认是12,
*              改成25是为了跟system_ARMCM3.c中定义的__SYSTEM_CLOCK相同,确保仿真的时候时钟一致
*/
int main(void)
{
   
   	
	OS_ERR err;
	
	/* 关闭中断 */
	CPU_IntDis();
	
	/* 配置SysTick 10ms 中断一次 */
	OS_CPU_SysTickInit (10);
	
	/* 初始化相关的全局变量 */
	OSInit(&err);
	
	/* 创建任务 */
	OSTaskCreate ((OS_TCB*)      &Task1TCB, 
	              (OS_TASK_PTR ) Task1, 
	              (void *)       0,
	              (CPU_STK*)     &Task1Stk[0],
	              (CPU_STK_SIZE) TASK1_STK_SIZE,
	              (OS_ERR *)     &err);

	OSTaskCreate ((OS_TCB*)      &Task2TCB, 
	              (OS_TASK_PTR ) Task2, 
	              (void *)       0,
	              (CPU_STK*)
<think>好的,我现在需要帮助用户学习uCOS-III的开发和使用,从零开始的学习指南。首先,我需要回顾用户提供的引用内容,看看哪些信息可以利用。 用户给出的引用中,有关于优先级翻转问题、RT-Thread的学习程、嵌入式学习资料、GD32UCOSIII移植步骤,以及CPU_CntLeadZeros函数的实现细节。这些引用虽然来自不同的资源,但主要集中在实时操作系统(RTOS)的相关内容,尤其是uCOS-III的移植和底层实现。 用户的需求是“从零开始”的学习指南,所以需要分步骤、结构清晰。我应该先确定学习路径,然后结合引用中的具体例子,比如GD32F103RCT6的移植步骤,优先级翻转问题,任务创建和调度等,来构建程内容。 首先,基础概念部分需要介绍RTOS和uCOS-III的基本概念,用户可能对实时操作系统不太了解,需要简单解释。然后,开发环境搭建是关键,因为用户需要实际操作。引用中提到了STM32和GD32的例子,可以推荐使用这些开发板,并安装Keil或IAR工具链。 接下来,系统移植部分,引用4提到了GD32F103RCT6的移植步骤,这里可以详细说明如何新建工程、添加内核文件、修改配置文件等。同时,引用5中的CPU_CntLeadZeros函数涉及到硬件加速,可能在移植时需要注意处理器的支持情况,比如是否使用CLZ指令。 任务管理是uCOS-III的核心,引用4中提到了任务创建和调度器的启动,这部分需要详细讲解如何定义任务函数、创建任务、启动调度器。示例代码会很有帮助,比如展示任务创建的代码片段。 通信与同步机制方面,引用1提到了优先级翻转问题,这里可以引入信号量的使用和如何避免优先级翻转。可能需要解释互斥信号量和其他同步机制的区别和应用场景。 调试与优化部分,可以结合引用中的实验例程,如计数型信号量实验,说明如何通过调试工具分析任务状态和性能。此外,内存管理和中断处理也是常见问题,需要指导用户如何配置系统服务。 最后,推荐学习资源时,可以提到用户提供的引用中的链接,如正点原子资料、RT-Thread程和恩智浦社区的资源,这些都是宝贵的学习材料。同时,提醒用户实践的重要性,建议从简单项目开始逐步深入。 需要确保回答符合系统指令,使用正确的中文和LaTeX格式。生成的问题要围绕uCOS-III的学习难点、移植步骤、任务调度机制、优先级翻转解决方案以及开发板选择等,帮助用户进一步深入学习。</think>### uCOS-III 从零开始学习指南 #### 一、基础知识准备 1. **实时操作系统(RTOS)概念** - 理解任务调度、优先级、中断管理等核心机制 - 掌握临界区、信号量、消息队列等通信机制[^1] 2. **硬件平台选择** - 推荐使用STM32F103/GD32F103系列开发板(Cortex-M3内核- 准备J-Link/ST-Link调试工具和示波器(时序分析) #### 二、开发环境搭建 1. **工具链配置** ```markdown - Keil MDK-ARM 5.xx + STM32CubeMX - 或 IAR Embedded Workbench + STM32标准库 - 安装uCOS-III源码包(建议使用V3.08.00版本) ``` 2. **工程模板创建 - 通过STM32CubeMX生成基础工程 - 添加uCOS-III内核文件: ```c os_cfg.h // 系统配置头文件 os_cpu_c.c // 处理器相关移植层 os_cpu_a.asm// 汇编层接口[^5] ``` #### 三、系统移植实战(以GD32F103为例) 1. **时钟配置** ```c void BSP_OS_TickInit(void) { SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC); } ``` 2. **任务栈初始化 - 修改`os_cpu.h`中的栈增长方向: ```c #define OS_STK_GROWTH 1 // 向下增长模式 ``` 3. **上下文切换实现 -`OS_CPU_PendSVHandler`中断服务函数[^4] - 使用汇编实现任务切换(参考`os_cpu_a.asm`) #### 四、任务管理实践 1. **任务创建示例** ```c #define TASK_STK_SIZE 128 OS_TCB AppTaskStartTCB; CPU_STK AppTaskStartStk[TASK_STK_SIZE]; void main(void) { OSInit(&err); OSTaskCreate(&AppTaskStartTCB, "Start Task", AppTaskStart, 0, 1, &AppTaskStartStk[0], TASK_STK_SIZE/10, TASK_STK_SIZE, 0, 0, 0, OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, &err); OSStart(&err); // 启动调度器[^4] } ``` 2. **优先级配置原则** - 系统任务优先级范围:0-OS_CFG_PRIO_MAX-1 - 建议保留最高优先级(0)给中断服务任务 #### 五、通信机制应用 1. **信号量解决优先级翻转** ```c OS_SEM shared_resource_sem; void HighPriorityTask(void) { OSSemPend(&shared_resource_sem, 0, OS_OPT_PEND_BLOCKING, 0, &err); // 访问共享资源 OSSemPost(&shared_resource_sem, OS_OPT_POST_1, &err); } ``` - 使用互斥信号量时应设置`OS_OPT_PEND_HIGH_PRIO`选项[^1] #### 六、调试技巧 1. **系统状态监控** - 使用`OSView`或`SystemView`工具可视化任务调度 - 通过`OSTaskStkChk()`检测栈溢出 2. **常见问题排查** - 任务无法调度:检查`OSStart()`是否调用 - 中断不响应:确认`OS_CFG_ISR_POST_DEFERRED_EN`配置 - 内存不足:调整`OS_CFG_TASK_STK_REDZONE_SIZE` #### 七、学习资源推荐 1. **官方文档** -uCOS-III User Manual》必读 - Micrium官网应用笔记 2. **实践项目路径** ```mermaid graph LR A[LED闪烁任务] --> B[多任务通信] B --> C[文件系统集成] C --> D[网络协议栈移植] ``` 3. **社区资源** - 正点原子STM32开发板配套程[^1] - RT-Thread学习社区[^2] - 恩智浦技术社区LPC案例[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值