找回密码
 立即注册
楼主: CosyOS

全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板

 火... [复制链接]

4

主题

36

回帖

948

积分

高级会员

积分
948
发表于 2025-5-21 19:37:07 | 显示全部楼层
如图,两个报警是什么原因?
截图202505211933434988.jpg

点评

你把编译器配置好就不会有告警了。 [attachimg]101005[/attachimg] “生成全局可重入函数”打勾就好了。  详情 回复 发表于 2025-5-21 21:49
回复

使用道具 举报 送花

5

主题

1206

回帖

4812

积分

荣誉版主

积分
4812
 楼主| 发表于 2025-5-21 21:49:15 | 显示全部楼层
stc-x*** 发表于 2025-5-21 19:37
如图,两个报警是什么原因?

你把编译器配置好就不会有告警了。
QQ20250521-214643.png
“生成全局可重入函数”打勾就好了。

回复

使用道具 举报 送花

5

主题

1206

回帖

4812

积分

荣誉版主

积分
4812
 楼主| 发表于 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 进行升级安装。

截图202505221313136303.jpg 截图202505221315339401.jpg


回复

使用道具 举报 送花

0

主题

6

回帖

318

积分

中级会员

积分
318
发表于 2025-5-23 16:15:24 | 显示全部楼层
Yang.*** 发表于 2025-5-20 10:11
https://www.stcaimcu.com/forum.p ... tid=1807&pid=164755 参考这里,看看是不是设置了低功耗模式,ADC ...

感谢指点迷津
回复

使用道具 举报 送花

5

主题

85

回帖

769

积分

高级会员

积分
769
发表于 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 在什么地方没找到?

麻烦作者给详细解释下吧!




点评

参见这里,原理是一样的: https://www.stcaimcu.com/thread-1807-95-1.html u_taskhand_Sysidle 是在创建 Sysidle 时定义的, uCreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname) 宏替换后就有了 s  详情 回复 发表于 2025-5-23 20:11
回复

使用道具 举报 送花

5

主题

1206

回帖

4812

积分

荣誉版主

积分
4812
 楼主| 发表于 2025-5-23 20:11:57 | 显示全部楼层
sdw*** 发表于 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,了解相关的类型定义,里面会有较详细的注释。




回复

使用道具 举报 送花

5

主题

85

回帖

769

积分

高级会员

积分
769
发表于 2025-5-27 10:34:58 | 显示全部楼层
能详细介绍下PendSV在cosyos中的运行原理吗?他和Systisk之间是怎么协作的。最好能举例说明一下。

点评

你自己先研究一下,或看看以前的贴子,有相关说明,等我抽时间再做讲解  发表于 2025-5-28 18:36
回复

使用道具 举报 送花

5

主题

85

回帖

769

积分

高级会员

积分
769
发表于 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;       /*!< 任务创建 [0:静态创建,1:动态创建未重分配,2:动态创建已重分配] */
                                            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个跟任务控制块相同的结构。





2025-05-28 09 15 01.png

点评

注意,在控制块结构体中,用 struct s_tasknode_ts 是在多次定义指针变量,而非实体。 这就是链表。。。  详情 回复 发表于 2025-5-28 18:43
回复

使用道具 举报 送花

4

主题

36

回帖

948

积分

高级会员

积分
948
发表于 2025-5-28 11:00:44 | 显示全部楼层
用AiCube生成的工程中,有printf字符发送重定向函数,编译没有报警错误。当升级为CosyOS工程时,编译时有错误提示。我仿照前面的CosyOS工程试例,单独建一个C文件,将putchar()函数放进来,然后在函数的上面复制这一句#pragma functions(static),这样再编译时就没有错误提示了。这是什么原因呢?
微信截图_20250528105238.png

点评

启用全局可重入:[attachimg]101758[/attachimg] [attachimg]101760[/attachimg] “1”是当启用全局可重入时,这些函数都声明了 static 属性,包括 putchar; “2”是未启用全局可重入时,这些函数都没有额外声明  详情 回复 发表于 2025-5-28 18:17
回复

使用道具 举报 送花

5

主题

1206

回帖

4812

积分

荣誉版主

积分
4812
 楼主| 发表于 2025-5-28 18:17:37 | 显示全部楼层
stc-x*** 发表于 2025-5-28 11:00
用AiCube生成的工程中,有printf字符发送重定向函数,编译没有报警错误。当升级为CosyOS工程时,编译时有错 ...

启用全局可重入: 截图202505281551084513.jpg

截图202505281605474956.jpg
“1”是当 C251版本 >= 2.00 时,这些函数都声明了 static 属性,包括 putchar;
“2”是当 C251版本 <   2.00 时,我们不必管它,因为我们现在用的版本都会大于2.00。

启用全局可重入后:
1、如果你的 putchar 不做更多修饰,默认为 reentrant 属性;
2、如果你的 putchar 所在的C文件中,包含了 stdio.h,你的 putchar 也必须定义为 static 属性,
否则,声明和定义不同,导致报错,
截图202505281737181186.jpg
3、如果你的 putchar 所在的C文件中,未包含 stdio.h,你的 putchar 无论是否定义为 static,都不会报错。
但是 你的 putchar 仍然必须定义为 static,否则它不会被编译。
因为 你的 putchar 未定义 static,不能满足使用要求,
此时 printf 仍然会调用 标准库中的 putchar,而非你的 putchar,
而后 你的 putchar 被 REMOVEUNUSED 移除掉了。

结论:
1、如果未启用全局可重入,用户的 putchar 可以普通定义方式,也可以定义 static 属性。
2、如果启用了全局可重入,用户的 putchar 必须 定义 static 属性。

方法1:
缺点是 putchar 之后的所有函数也一并定义了 static 属性。
#pragma functions(static)
char putchar(char c)
{

}

方法2:
只有 putchar 会被定义 static 属性,对后续其它函数无影响。
#pragma SAVE
#pragma functions(static)
char putchar(char c)
{

}
#pragma RESTORE




回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-22 12:35 , Processed in 0.073785 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表