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

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

 火... [复制链接]

5

主题

1208

回帖

4820

积分

荣誉版主

积分
4820
 楼主| 发表于 2025-5-28 18:43:02 | 显示全部楼层
sdw*** 发表于 2025-5-27 17:44
/**
\brief      任务节点(控制块)
\details    CosyOS 的 任务节点 即 任务控制块,包含了任务所需的 ...

注意,在控制块结构体中,用 struct s_tasknode_ts 是在多次定义指针变量,而非实体。
这就是链表。。。
回复

使用道具 举报 送花

4

主题

36

回帖

950

积分

高级会员

积分
950
发表于 2025-5-29 23:48:30 | 显示全部楼层
我动态创建了2个任务,下载后不运行。但将任务改成静态创建后,却能正常运行。不知什么原因?后面附有工程文件。

stc32g-cosyos-led2.zip

2.55 MB, 下载次数: 190

点评

根本原因找到了,是 Starter 任务栈小了。 任务动态创建后,启动任务需要更大的任务栈,syscfg.h 中,把 Starter 任务栈 设置大一些就好了,不必再调整内存池指针。  详情 回复 发表于 2025-5-30 15:17
你只需适当调整一下内存池就可以了, 把内存池指针改小一点,哪怕改成“2716”都能跑起来。 关于这个问题的原因我需要再深入研究一下,恐怕没有那么简单。  详情 回复 发表于 2025-5-30 14:38
回复

使用道具 举报 送花

5

主题

1208

回帖

4820

积分

荣誉版主

积分
4820
 楼主| 发表于 2025-5-30 14:38:15 | 显示全部楼层
stc-x*** 发表于 2025-5-29 23:48
我动态创建了2个任务,下载后不运行。但将任务改成静态创建后,却能正常运行。不知什么原因?后面附有工程 ...

你只需适当调整一下内存池就可以了,
把内存池指针改小一点,哪怕改成“2716”都能跑起来。

关于这个问题的原因我需要再深入研究一下,恐怕没有那么简单。

回复

使用道具 举报 送花

5

主题

1208

回帖

4820

积分

荣誉版主

积分
4820
 楼主| 发表于 2025-5-30 15:17:33 | 显示全部楼层
stc-x*** 发表于 2025-5-29 23:48
我动态创建了2个任务,下载后不运行。但将任务改成静态创建后,却能正常运行。不知什么原因?后面附有工程 ...

根本原因找到了,是 Starter 任务栈小了。
任务动态创建后,启动任务需要更大的任务栈,
syscfg.h 中,把 Starter 任务栈 设置大一些就好了,不必再调整内存池指针。

截图202505301519154295.jpg
截图202505301521294014.jpg

回复

使用道具 举报 送花

已绑定手机

0

主题

66

回帖

1268

积分

金牌会员

积分
1268
发表于 2025-6-2 09:56:07 | 显示全部楼层
回复

使用道具 举报 送花

已绑定手机

14

主题

67

回帖

1790

积分

金牌会员

积分
1790
发表于 2025-6-3 23:31:26 | 显示全部楼层
我是用usbcdc库添加usb_init()就出现L127,L128错误,注释掉后就能正常编译。单独使用usbcdc程序是正常的。想请教一下老师们这个问题怎么解决。

CosyOS-III.zip

4.67 MB, 下载次数: 178

回复

使用道具 举报 送花

已绑定手机

14

主题

67

回帖

1790

积分

金牌会员

积分
1790
发表于 2025-6-4 18:27:06 | 显示全部楼层
一束光*** 发表于 2025-6-3 23:31
我是用usbcdc库添加usb_init()就出现L127,L128错误,注释掉后就能正常编译。单独使用usbcdc程序是正常的。 ...

自己回复一下,参考了论坛坛友的一个解决方法,如下图所示:
截图202506032330317750.jpg
截图202506041826537629.jpg

点评

这个问题的根源在于,在 Keil C251/A251 下,在不同条件下,汇编函数的命名法是不同的。 这些条件具体包括了 Code Rom Size(Large、Huge)、函数属性(reentrant、static)等, 它们将影响汇编函数的尾缀命名规则  详情 回复 发表于 2025-6-5 15:35
回复

使用道具 举报 送花

5

主题

1208

回帖

4820

积分

荣誉版主

积分
4820
 楼主| 发表于 2025-6-5 15:35:39 | 显示全部楼层
一束光*** 发表于 2025-6-4 18:27
自己回复一下,参考了论坛坛友的一个解决方法,如下图所示:

这个问题的根源在于,在 Keil C251/A251 下,在不同条件下,汇编函数的命名法是不同的。

这些条件具体包括了 Code Rom Size(Large、Huge)、函数属性(reentrant、static)等,
它们将影响汇编函数的尾缀命名规则。
总之在不同情况下,汇编函数名称后面可能需要添加不同的尾缀,如 ?  ??  ?_  等。

你遇到的问题,void usb_init(); 如此声明,那么在 lib中,汇编函数的名称已固定为 usb_init。
当启用全局可重入时,编译器会认为 void usb_init() 是一个reentrant函数,它的汇编函数名称
应为 usb_init?_,但实际上它在lib中是命名为 usb_init,所以才会报错 L127、L128,未解析的
外部模型,因为找不到 usb_init?_。

个人观点:对于 STC32,不启用全局可重入函数是愚蠢的行为,如非必要,还是启用为好,
这样会像ARM一样易用,因为不必再像51一样,凡是函数都要考虑会不会重入?是否可重入?等问题。

解决方法(前提还是要启用全局可重入函数):
截图202506051646397161.jpg
把 void usb_init(); 声明为 static属性,这样它的汇编函数名称仍为 usb_init,
这样问题完美解决


回复

使用道具 举报 送花

5

主题

1208

回帖

4820

积分

荣誉版主

积分
4820
 楼主| 发表于 2025-6-5 16:43:20 | 显示全部楼层
以前我说的 有关 __C251__ 的描述 是错误的,
这个 __C251__ 单纯就是版本号,与全局可重入无关的,是我想多了,特此更正。
截图202506051636438528.jpg
所以,(__C251__ >= 200) 是指 C251版本 >= 2.00。

不过所涉及到的问题,提供的解决方案基本还都是正确的。

下一步,我会把相关的回复做一次更正。

回复

使用道具 举报 送花

已绑定手机

14

主题

67

回帖

1790

积分

金牌会员

积分
1790
发表于 2025-6-5 16:56:10 | 显示全部楼层
Cos*** 发表于 2025-6-5 16:43
以前我说的 有关 __C251__ 的描述 是错误的,
这个 __C251__ 单纯就是版本号,与全局可重入无关的,是我想 ...

十分感谢老师能够指导。老师我按照您的回复说明测试了,还出现了L127,L128的错误提示。我对c的理解还是很浅薄,想请老师抽时间看一下我的代码。目前我这个代码想利用单片机的USBCDC来实现对系统的监控,把原来例程上使用串口2来监控替换掉。

20250605CosyOS-III.zip

3.44 MB, 下载次数: 171

点评

[attachimg]102796[/attachimg] 因为你这里 [attachimg]102797[/attachimg] 添加的是 usbcdc_lib 里面的文件,所以要删除掉 根目录下多余的同名文件, 否则编译的是根目录下的文件,不是你修改的文件。  详情 回复 发表于 2025-6-5 17:28
这个问题的原因是,你的工程一团糟,到处都有相同的文件,编译的文件不是你修改的文件。 [attachimg]102789[/attachimg] 头文件这样改就行了, 而后,删除多余的文件, [attachimg]102791[/attachimg] 删除 [attachi  详情 回复 发表于 2025-6-5 17:18
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-23 16:18 , Processed in 0.085236 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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