CosyOS
发表于 2024-11-13 21:19:42
本帖最后由 CosyOS 于 2024-11-14 09:52 编辑
CosyOS-II 最新版 V3.1.0 发布!
新版特性:
1、内核文件已加入大量注释,并支持 doxygen。
2、部分结构体成员、服务函数形参和局部变量,重新命名,新名称更为科学、规范;
如:
htask:任务句柄
hmut:互斥信号量句柄
hbin:二值信号量句柄
hsem:计数信号量句柄
htbox:信箱句柄
hmbox:邮箱句柄
hque:队列句柄
hmem:线程内存句柄
。。。
3、重新封装了 定时中断/查询 的数据结构。
4、全局变量钩子 调整为 副本钩子 void copy_hook(void);。
5、中断中的全局变量读访问 有所调整:
/* 读哪一个全局变量?*/
#define iWhichGVar_Read s_sign_updatecopy /** \return bool,true:读正本,false:读副本)*/
6、sv_int_pend_fifo.c 中,加入了 手动裁剪开关:
如 恢复任务:
7、系统配置文件中,加入了 Starter 创建模式:
8、增加了 API 中断中触发 PendSV:
/*
* 触发PendSV
* 在用户中断中,当采用中断挂起服务FLAG队列执行服务时,
* 用户在设置标志位后需手动触发PendSV,而后在 pendsv_hook() 中执行服务。
*/
#define iPendSV_SetmPendSV_Set
专业版测试程序的调整:
1、完善了 事件标志组 测试例程。
2、邮箱测试例程中,当传输指针时:
如果邮件的数据类型为非原子访问类型,应酌情考虑“写邮件”与“读邮件”之间的互斥访问问题。
关于这个问题,已调整了相关代码和注释。
其实,消息队列也同样存在这个问题,当传输指针时:
如果消息的数据类型为非原子访问类型、非 常量,也应考虑“写消息”与“读消息”之间的互斥访问问题。
对于 “发送邮件”与“接收邮件”之间、“发送消息”与“接收消息”之间,它们的互斥访问是由 OS内核服务 保证的,用户无需多虑。
同理,这个问题对于其它 RTOS 来说可能也同样存在,用户应予以重视!
3、增加了 全局变量访问示例:
示例中包括了非原子访问全局变量、全局数组、全局字符串,
分别在 任务、滴答、中断,中的,读访问、写访问、自运算;
针对全局变量自运算,还分别给出了
挂起服务调用 iPendSVC(fp) 和 挂起服务钩子 pendsv_hook
两种方案的应用示例,是非常全面的。
注意:该示例程序不能进行编译测试,
当编译 Test 中的测试例程时,最好是移除该文件,
否则 C251会有警告,MDK 会消耗 你的电脑的CPU使用率。
稍后,将会在顶楼发布最新版测试例程。
sdwys
发表于 2024-11-14 09:16:27
V3.1的发布又向完美迈进了一步,感谢作者的付出与努力,为作者点赞。
CosyOS
发表于 2024-11-14 09:30:53
sdwys 发表于 2024-11-14 09:16
V3.1的发布又向完美迈进了一步,感谢作者的付出与努力,为作者点赞。
未来,还会进一步增强注释,逐步完善。
首先就是 ur_api.h,加入中文注释,支持 doxygen,使其 直接就是 说明书。
因为对于用户来说,API说明书是至关重要的。
sdwys
发表于 2024-11-15 17:01:18
今天调试跟踪了一下午,想看看从MCU上电到启动系统之间都做了些什么工作,可能对251汇编不大熟悉把自己都搞懵了,作者能否给讲一下,从上电到进入系统,由系统接管后开始调度都做了那些工作。
CosyOS
发表于 2024-11-15 20:40:01
本帖最后由 CosyOS 于 2024-11-15 20:59 编辑
sdwys 发表于 2024-11-15 17:01
今天调试跟踪了一下午,想看看从MCU上电到启动系统之间都做了些什么工作,可能对251汇编不大熟悉把自己都搞 ...
可以通过仿真来查看整个启动过程。
首先是启动文件:
设备上电初始化后,从 绝对代码段 地址0 开始执行。
行151:这里是一条跳转指令,LJMP 到 STARTUP1(行154);
↓
行154:初始化 DPXL;
↓
行157~162:EDATA清零;
↓
行166~175:HDATA清零;
↓
如果是MSP模式,执行 行179:栈指针指向 #?STACK-1,即编译后 EDATA空闲区首地址 -1;
如果是PSP模式,执行 行181:栈指针指向 EDATA 最后 512;
↓
行185:跳转到 main()。
下面是 main() 函数:
行24~27:如果安全运行时使能,清零所有超时信号;
↓
行30:初始化 定时中断/查询,
这其实是一个装载的过程,所有定时中断/查询在创建时都会定义一个控制块,
在此把它们的控制块指针 装载到 指针数组中,即 定时中断/查询句柄;
s_timinthand_tsp s_timint_handle; /*!< 定时中断句柄 */
s_timqryhand_tsp s_timqry_handle; /*!< 定时查询句柄 */
↓
行32:调用初始化钩子,进行用户的初始化工作;
↓
行33:系统初始化,即 OS的初始化,那它又做了什么呢?
首先是 初始化内存池;
而后是 初始化定时器0 → 启动定时器0 → 开启 定时器0 和 PendSV 中断 → 开启总中断;
// 这里有一个很重要的问题,就是必须先进行用户初始化,而后再系统初始化;
否则,就容易出问题了。。。
↓
行34:启动 Starter;
↓
行35:启动 Sysidle;
在 PendSV中断中,当 系统空闲任务 加入到 任务队列 后,系统将自动开启任务调度,
而首个被调度运行的任务当然是 Starter。
Starte运行后,
首先是启动所有定时查询任务;
↓
而后是启动所有定时中断任务;
↓
最后是调用 start_hook,至此,控制权正式转交到用户手中。
用户可在 start_hook 中启动自己的任务 或 执行一些需要缓期执行的初始化工作。
大锤子
发表于 2024-11-16 13:36:33
老师,有最新版相关的视频教程不? 我开始跟着视频学习,下载的最新版,结果编译失败。 想学最新版的。
CosyOS
发表于 2024-11-16 13:49:55
大锤子 发表于 2024-11-16 13:36
老师,有最新版相关的视频教程不? 我开始跟着视频学习,下载的最新版,结果编译失败。 想学最新版的。...
那没有哦。
其实这个事不用纠结,
你先跟着视频学习,懂了原理之后,就可以用最新版,自己修改、调整了。
或跟着视频同步操作的话,就用当时提供的课程资料。
道理都是一样的,无论新版、旧版,都不影响你的学习,又不是做产品。
大锤子
发表于 2024-11-16 13:51:55
CosyOS 发表于 2024-11-16 13:49
那没有哦。
其实这个事不用纠结,
你先跟着视频学习,懂了原理之后,就可以用最新版,自己修改、调整了。 ...
好的, 感谢老师的回复 {:5_332:}
stc-xuewei
发表于 2024-11-19 10:21:57
CosyOS-II-STC8H和CosyOS-II-STC32G是不是可以直接使用于Ai8051单片机?
神农鼎
发表于 2024-11-19 10:26:32
stc-xuewei 发表于 2024-11-19 10:21
CosyOS-II-STC8H和CosyOS-II-STC32G是不是可以直接使用于Ai8051单片机?
可以