| 
				打卡等级:偶尔看看II打卡总天数:26最近打卡:2025-10-16 11:22:17 荣誉版主 
 
	积分2773 
 | 
 
| uC/OS-II@8H8K64U, 51核移植版本 杨教授点评:51核上激动人心的RTOS生态已初步具备
 自研项目需要自带80mA大电流LED数码管自动刷新驱动的型号
 8H4K32TL@RMB1.6.
 
   习惯了用uCOS做代码,又没找到合适的,于是就花了几天时间,自己移植了一个.
 我看过的 uC/OS-II-51核 移植版都是采用了堆栈向上增长的模式.
 而实际上,uC/OS管理的是xdata区的模拟栈.KeilC51模拟栈是向下增长的,
 这导至了uC/OS-II的许多新特性不能用,比如:OSTaskCreateExt(), 堆栈检查等功能.
 实际上,历史移植版本虽然用的是uC/OS-II的代码,却只实现了uC/OS-1的功能.
 
 简介:
 本移植版是完整的 uC/OS-II-51核 移植版, 并对51核的特殊性做了大量的优化.
 此移植版本使用 "PendSv" 中断切换任务.
 
 对比:
 和以前移植版本相比较,一些新的特性描述如下:
 1.支持用户选择 small 或 large 编译模式, small 和 large 模式可以共存.
 2.OS切换上下文时,不关中断,中断可以快速响应.
 3.中断里不再需要使用 OSIntNesting++和OSIntExit().符合中断快进快出原则,也符合使用习惯.
 (特别说明: 是彻底消除了OSIntNesting, 连这个变量都删除了)
 4.OS内核函数统一使用 small 编译模式,和用户选择无关,提高了效率.
 5.无论是 small 或 large 都已经做了reentrant支持. 无须选择或配制.
 6.完整的移植版本,uC/OS-II所有功能都可用.
 
 测试:
 例程已包含并通过了 "计数信号量, 消息邮箱, 标志集, 邮箱队列, 互斥信号量, 内存管理, 软件定时器,
 任务上锁/解锁, 任务挂起/解挂, 获取OS时间, 统计任务, 堆栈检查,"  的简单功能测试.
 
 移植版本于2024/5/4完成, 未经过长时间验证, 如果您将它用于项目, 请自行评估风险.
 
 
 使用:
 特别注意: os_cpu.h 中: #define  OS_STK_GROWTH   1  //定义栈的增长方向, 对应的是模拟栈, 向下增长
 创建任务时注意:栈顶是 &TASK_STK[STK_SIZE-1] , 栈底是&TASK_STK[0] . 这时和以前的移植版本刚好反了一下,所以特别提醒!
 调度器开启前不要打开EA, 启用调度器时会自动打开EA.
 请严格遵守临界区配对使用的原则.
 
 配制:
 small 或 large 编译模式可以自由选择,其它项目配制请参照例程.
 所有任务函数不要配制为可重入,并设置为调用树顶层,参照配制选项卡" LX51 Misc ".
 OS采用一个硬件中断来模拟PendSv行为, 用于切换任务. PendSv占用一个中断源.
 配制PendSv: 详情请转至 os_cfg.h  os_cpu.h  os_cpu_a.c
 配制时钟源: 请转到 Config.h
 OS已占用定时器0用作系统滴答,最低侁级.
 
 关于选择编译模式:
 推荐选择 large 模式,省事省心.
 用large模式时,xdata管够. 所以:用户函数的非可重入方式, 效率也不比 small+reentrant 模式低多少.
 
 可以选择 small 模式,但是全局变量和局部段会逐步吞噬掉DATA空间,需要引起注意.
 一个有效的办法是全局变量显式指定存储类型, 同时用户函数也显式指定为 reentrant, 就不会有全局段和局部段侵占DATA空间的机会.
 但有仍有两个潜在的风险:
 1. small+reentrant 模式,可能会撑爆(idata)公共运行栈,所以如果你这么用,千万不要有很大尺寸的局部变量.
 2. 库函数只认全局设置的属性,不能单独指定属性. 它可能成为侵占DATA的头号元凶.
 (最终建议:代码量较大时还是不要选择 small 模式, 太麻烦!)
 
 代码经过了三天的运行:
 
   
 
 2024/7/8更新代码
 
  uCOS-II_STC8H_small+large.rar
(188.37 KB, 下载次数: 5082) 
 
 
 
 
 
 
 
 
 
 
 
 | 
2
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
 
 +5楼主威武~
 +5楼主威武~
 |