本帖最后由 CosyOS 于 2023-11-14 13:56 编辑
CosyOS-II 已升级至 V1.1.3,除 API用户参考手册外,其它说明文档基本更新完毕。
CosyOS-II V1.1.3 新增及调整功能如下:
1、调整了进入、退出任务临界区函数的形式及功能,
原为两套函数,一套返回void,一套返回bool;
现为只有一套函数,并返回void,当需要返回bool时,用函数类型强制转换。
此法无论哪种内核,均可实现最小的代码量,最佳的性能。
2、系统配置文件中,取消了临界区相关设置,任务临界区与全局临界区都固定支持嵌套功能,最大嵌套深度255。
3、MCU配置文件中,新增配置项:任务栈配置、自定义任务切换现场保护。
4、新增报警:
rts:任务栈重分配发生,虽然成功了,但仍要提醒用户任务栈定义小了。
任务栈重分配机制被设计用来在正式的产品中抵御任务栈溢出的风险,用户在开发测试阶段应避免这种情况的发生。
ots:在概率上、在未来必然会发生的任务栈溢出(虽然现在可能并未发生)。
5、调整了部分API,具体包括:
互斥信号量、计数信号量、二值信号量相关。
互斥信号量仅用于任务中实现互斥访问:
互斥访问:“获取” 与 “归还” 需配对使用,实现互斥访问:
获取:uTakeMut(mut, tc);
归还:uBackMut(mut)。
二值信号量用于线程同步及互斥访问:
线程同步:“上锁”、“给予” -> “查询”、“等待”、“获取”;
互斥访问:“获取” 与 “归还” 需配对使用,实现互斥访问。
计数信号量用于线程同步及互斥访问:
线程同步:“给予” -> “获取”;
互斥访问:“获取” 与 “归还” 需配对使用,实现互斥访问。
不支持在中断中“获取”。
其实,“给予”、“归还” 本质上做的是一件事,就是释放、发送信号量,但由于CosyOS不关总中断,必须针对“线程同步”与“互斥访问”分别处理。
再补充两个重要说明:
CosyOS-II 在临界区中或关闭总中断时调用服务注意事项一、在任务中,以下服务不支持在临界区中(包括任务临界区和全局临界区)或关闭总中断时调用:
启动任务:uStartTask(task, status)、uStartTask_Ready(task)、uStartTask_Suspend(task)。
互斥信号量获取:uTakeMut(mut, tc)。
二值信号量等待:uWaitBin(bin, tc)。
二值信号量获取:uTakeBin(bin, tc)。
计数信号量获取:uTakeSem(sem, tc)。
接收飞信:uRecvFetion(tbox, tc)。
接收私信:uRecvTaskMsg(tc)。
接收邮件:uRecvMail(mail, mbox, tc)。
接收消息:uRecvMsg(que, tc)。
等待标志组:uWaitFlagGroup(group, tc)。
二、其它会导致任务调度/切换的服务,虽支持在临界区中或关闭总中断时调用,但也必须等到最终退出临界区或开启总中断后才能切换任务。
CosyOS-II 中断服务调用注意事项凡事都是辩证的,有一利必有一弊。CosyOS-II 在实现零中断延迟的同时,在服务的调用上,也必然会存在一些限制条件。
- 一、用户中断中写全局变量
当用户在中断中调用iWriteGVar(gv, lp)、iWriteGAry(gp, lp, size)、iWriteGStr(gs, ls)写一个全局变量时,lp、ls所指向的局部变量要做为专用。
1、当服务调用以后,该局部变量不可以被改变;
2、如果某次进入中断以后,该局部变量被更新,必须再次调用相同的服务写同一个全局变量(gv)。 - 二、用户中断中发送邮件
当用户在中断中调用iSendMail(mbox, mail)发送邮件时,mail所指向的局部邮箱要做为专用。
1、当服务调用以后,该局部邮箱不可以被改变;
2、如果某次进入中断以后,该局部邮箱被更新,必须再次调用相同的服务发送邮件至同一个邮箱(mbox)。 - 三、用户中断中读全局变量
当用户在中断中调用iReadGVar(gv)、iReadGVar(gv, type)读一个全局变量时,
如果在某个与该中断优先级不同的非最低优先级的中断中会写同一个全局变量,那么仅在下面两种情况下会确保万无一失:
1、在那个中断中,用于写该全局变量的局部变量为常量(不会改变);
2、那个中断的发生频率足够低,可保证在PendSV中最终完成服务(写全局变量)以后,那个中断才会再次发生。 - 四、用户中断中接收邮件
当用户在中断中调用iRecvMail(mail, mbox)接收邮件时,不同优先级的中断,不可接收来自同一个邮箱中的邮件;
如果在某个与该中断优先级不同的非最低优先级的中断中会发送邮件至同一个邮箱,那么仅在下面两种情况下会确保万无一失:
1、在那个中断中,用于发送邮件的局部邮箱为常量(不会改变);
2、那个中断的发生频率足够低,可保证在PendSV中最终完成服务(发送邮件)以后,那个中断才会再次发生。 - 五、用户中断中接收飞信
当用户在中断中调用iRecvFetion(tbox)接收飞信时,不同优先级的中断,不可接收来自同一个信箱中的飞信。 - 总结
条件一和条件二其实算不上什么条件,只要注意局部变量或邮箱做为专用就可以了。
条件三和条件四则需要反复揣摩一番,深刻理解其含义,并在实际应用中加以关注。
专业版测试程序待过几日再发布新版。
|