CosyOS
发表于 2025-5-20 20:51:09
正是这个原因
CosyOS
发表于 2025-5-20 21:36:02
CosyOS-III 最新动态
当前,CosyOS-III 最新版本为 V1.4.7,较早期版本已经取得了十足的进步,
下面挑一些要点做一下简单介绍:
1、解决了当嵌套获取多个互斥信号量时,可能会发生的优先级反转问题(该bug普遍存在于常见主流RTOS中)。
2、完善了对 Arm Compiler 5/6、GNU Compiler、IAR Compiler 等主流编译器的支持,并实现了良好的易用性。
3、优化了任务管理器CPU使用率相关算法,以后即使是在极端情况下,也不会出现某个任务或总的CPU使用率超过100%的情况。
4、推出了 实用例程 及 升级安装程序 CosyOS-III Cube.exe,可轻松将您的裸机工程升级为CosyOS工程。
以后,大家可以自己先创建一个基础工程(裸机工程),而后使用 CosyOS-III Cube 升级为 CosyOS工程。
CosyOS-III Cube 详细使用说明:
1、本程序仅适用于把一个非CosyOS工程升级为CosyOS工程。
2、CosyOS-源代码根文件夹,必须命名为 cosyos-master。
3、cosyos-master,可放置在工程文件所在分区的任意位置。
4、CosyOS-III Cube.exe,必须在 cosyos-master\Setup
下运行,不可拷贝至其它位置运行。
如上述条件不能满足,请先退出安装,待重新调整好后再行安装!
5、目标文件夹必须选择工程文件所在目录,支持的工程文件名:
Keil C51、C251:*.uvproj
Keil MDK-Arm:*.uvprojx
IAR EWARM:*.ewp
6、在升级工程之前,安装程序会自动为用户备份原工程文件,并重新命名为
your_project.*.bak,保存位置在原目录。
7、安装完成后,您还需进行系统配置(syscfg.h)、MCU配置(mcucfg_*.h)、
编译器配置、堆栈配置等一系列的配置工作,再参照CosyOS例程进一步完成
系统的构建,便可愉快的使用CosyOS了。
想试用的朋友请自行去 gitee 下载吧 。。。
stc-xuewei
发表于 2025-5-21 19:37:07
如图,两个报警是什么原因?
CosyOS
发表于 2025-5-21 21:49:15
stc-xuewei 发表于 2025-5-21 19:37
如图,两个报警是什么原因?
你把编译器配置好就不会有告警了。
“生成全局可重入函数”打勾就好了。
CosyOS
发表于 2025-5-21 22:28:33
CosyOS-III Cube.exe 新版发布,gitee上已更新。
新版实现了把支持图形用户界面的相关文件自动转码为 ANSI,又为用户省去了不少麻烦。
这个问题的根源是,在 Keil 下,启用文件的图形用户界面,如果文件内容有中文,编码必须
用ANSI,否则乱码;而 gitee 代码仓库上传的文件必须用 utf-8编码,如果上传的是ANSI,他
时常会自动转换为 utf-8。所以这件事就是会很麻烦。
想使用 CosyOS-III Cube 的用户需注意:
1、必须是一个 非CosyOS工程 才能升级为 CosyOS工程,如果已经是一个CosyOS工程了,不可以再升级。
2、用户必须使用从 gitee下载的原始代码进行升级安装。
3、如果CosyOS根文件夹的名称不是 cosyos-master,请自行改名为 cosyos-master。
4、拷贝 cosyos-master 至工程文件所在分区的任意位置(放到你想放的地方)。
5、进入 cosyos-master\Setup\,运行 CosyOS-III Cube.exe 进行升级安装。
Hei瞎搞
发表于 2025-5-23 16:15:24
Yang.Lian 发表于 2025-5-20 10:11
https://www.stcaimcu.com/forum.p ... tid=1807&pid=164755 参考这里,看看是不是设置了低功耗模式,ADC ...
感谢指点迷津{:4_196:}
sdwys
发表于 2025-5-23 16:57:48
宏扩展后看迷糊了,请作者给解释下吧?
_ecode = uStartTask_Ready(Sysidle);
扩展为:
#define uStartTask_Ready(Sysidle) \
uStartTask(Sysidle, 0x00 )
#define uStartTask(Sysidle, 0x00) \
sUSV_StartTask(&u_taskhand_Sysidle, 0x00)
/** 启动任务 */
#define sUSV_StartTask(&u_taskhand_Sysidle, 0x00) \
( \
(*(s_boolvoid_tfp)(su_kernel_lock0))() || true ? su_startup_task((s_taskhand_tsp)&u_taskhand_Sysidle, !0x00 ? OS_STATUS_READY : OS_STATUS_SUSPENDED) : OS_ECODE_NOERROR \
)
_ecode = (*(s_boolvoid_tfp)(su_kernel_lock0))()|| true ? su_startup_task((s_taskhand_tsp)&u_taskhand_Sysidle, !0x00 ? 0x00 : 0x08) : 0;
/** 内核上锁(进入非嵌套服务层临界区)*/
void su_kernel_lock0(void)
{
mSysIRQ_Disable();
} 内核上锁返回值为空 (*(s_boolvoid_tfp)(su_kernel_lock0))() 这一句怎么理解?
(s_taskhand_tsp)&u_taskhand_Sysidle 这个是把指针强制转换为任务控制块指针吧?
&u_taskhand_Sysidle 这个是取u_taskhand_Sysidle的指针吧! u_taskhand_Sysidle 在什么地方没找到?
麻烦作者给详细解释下吧!
CosyOS
发表于 2025-5-23 20:11:57
sdwys 发表于 2025-5-23 16:57
宏扩展后看迷糊了,请作者给解释下吧?
_ecode = uStartTask_Ready(Sysidle);
参见这里,原理是一样的:
https://www.stcaimcu.com/thread-1807-95-1.html
u_taskhand_Sysidle 是在创建 Sysidle 时定义的,
uCreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname)
宏替换后就有了
s_tasknode_ts u_taskhand_Sysidle;
s_tasknode_ts:这是控制块类型,所以
u_taskhand_Sysidle:是控制块。
s_taskhand_tsp:他是指向装载块的指针类型,
(s_taskhand_tsp)&u_taskhand_Sysidle:是把控制块指针转换为装载块指针,
启动任务时,一律使用装载块指针。
装载块,怎么回事?为什么要搞一个装载块?就需要你深入研究了,
要把任务的静态创建与动态创建结合到一起研究,
重点是先要看 os_redef.h,了解相关的类型定义,里面会有较详细的注释。
sdwys
发表于 2025-5-27 10:34:58
能详细介绍下PendSV在cosyos中的运行原理吗?他和Systisk之间是怎么协作的。最好能举例说明一下。
sdwys
发表于 2025-5-27 17:44:30
/**
\brief 任务节点(控制块)
\details CosyOS 的 任务节点 即 任务控制块,包含了任务所需的全部关键信息。
任务静态创建时,任务节点为静态;任务动态创建时,任务节点为动态。
*/
typedef struct s_tasknode_ts
{
mTaskNode_Head_ /*!< MSP:stacklen,PSP:psp,MSP+PSP:psp */
s_u8_t opri; /*!< 任务创建时的优先级 */
m_stacksize_t stacksize; /*!< 任务栈size */
struct s_tasknode_ts _OBJ_MEM_ * _STATIC_MEM_ *dualhandle; /*!< 任务二重句柄:指向任务句柄的指针 */
s_voidvoid_tfp entry; /*!< 任务函数入口指针 */
#if SYSCFG_DEBUGGING == __ENABLED__
const char _CONST_MEM_ *name; /*!< 任务名称(字符串)*/
#endif
#if SYSCFG_SAFERUNTIME == __ENABLED__
s_u16_t saferuntime;/*!< 安全运行时设定值 */
#endif
s_u8_t _OBJ_MEM_ *bsp; /*!< base stack pointer,任务栈的起始地址 */
s_u8_t create; /*!< 任务创建 */
s_u8_t pri; /*!< 任务当前优先级 */
s_u8_t status; /*!< 任务状态 */
s_u8_t blocktype; /*!< 阻塞类型 */
s_delay_t timer; /*!< 软件定时器(延时/超时计数)*/
void _STATIC_MEM_ *handle; /*!< 内核对象句柄,仅指向静态对象 */
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
s_sharing_t tc_counter; /*!< 滴答周期计数器 */
#endif
#if SYSCFG_DEBUGGING == __ENABLED__
s_u32_t usedtime[2];/*!< CPU 使用时间计数 */
m_stacksize_t stacklen_max; /*!< 任务栈的实际占用在历史上的最大值 */
#endif
#if SYSCFG_SAFERUNTIME == __ENABLED__
s_u32_t srt_counter;/*!< 安全运行时计数器 */
#endif
struct s_tasknode_ts _OBJ_MEM_ *last_b; /*!< 上一节点 of 阻塞链表 */
struct s_tasknode_ts _OBJ_MEM_ *next_b; /*!< 下一节点 of 阻塞链表 */
struct s_tasknode_ts _OBJ_MEM_ *next_t; /*!< 下一节点 of 定时器/超时链表 */
#if SYSCFG_SAMEPRISCHEDULE
struct s_tasknode_ts _OBJ_MEM_ *last; /*!< 上一节点 of 优先级组 */
struct s_tasknode_ts _OBJ_MEM_ *next; /*!< 下一节点 of 优先级组 */
#endif
mTaskNode_Tail_ /*!< MCS51/251:mUserReg_DEFc_,减栈:psp_top */
}s_tasknode_ts;
typedef s_tasknode_ts _OBJ_MEM_ *s_tasknode_tsp; /*!< 任务句柄 */
这个是任务控制块,如果我定义这样一个结构,在这个结构里边定义了6次 “struct s_tasknode_ts”相同结构,我可不可以理解为在这一个任务控制块里边包含了6个跟任务控制块相同的结构。