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

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

 火... [复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2024-8-22 11:28:36 | 显示全部楼层
本帖最后由 王锦平 于 2024-8-22 12:07 编辑

楼主有没有什么readme文件配合阅读,看不懂你这个宏定义对应的都是什么参数
  1. #define uCreateTask(task, pri, tss, srt, ntm) \
  2.         sCSV_CreateTask(task, pri, tss, srt, ntm, OS_NULL) /**[ \taskmsg\params (...) ]*//**< \taskcode {...} >*/
复制代码

task 是任务这个看懂
pri 是任务优先级这个看懂
tss 是任务堆栈大小
其余的就看不懂了

希望楼主可以出一个readme文档,放在工程里头,供大家可以快速上手移植、告知主程序入口以及常用函数的使用,几天看下来已经动了三四个文件了,有些寄存器引用在我所用的这个stc8c的头文件里头是没有的,可以的话建议使用宏函数来修改寄存器的值,我认为能更好的移植,就不用编译的时候去修改未定义的寄存器,以下就是我修改的片段。一份一份文件找过去的时候略微麻烦
  1. #define BIT_SET_ZERO(src, cnt) src &= ~(1 << cnt) // 给 src 左移 cnt位写0
  2. #define BIT_SET_ONE(src, cnt) src |= (1 << cnt) // 给 src 左移 cnt 位写1
  3. #define FIND_BIT(src, cnt) (src & (1 << cnt)) // 找 src 中左移 cnt 位的 1
  4. /* INT0中断优先级为0级 */
  5.         #if TATGET_STC8H
  6.         IPH &=~PX0H;
  7.         #endif
  8.         BIT_SET_ZERO(IPH, 0);
  9.         PX0 = 0;
复制代码
除了修改了目标MCU以后能过编译,后面参考test里面的文件改后就不能过编译了

点评

暂时先用这个吧,以后会出新版,合为一个说明文档。  详情 回复 发表于 2024-8-30 21:26
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2024-8-22 12:55:44 | 显示全部楼层
本帖最后由 王锦平 于 2024-8-22 14:16 编辑

问,工程里面用了两个串口,UART1和UART2分别是用来做什么的。若是UART2是用来debug OS的那为什么不用UART1?打印字符串时前面加"OSdebug"这样的标签不就好了?

点评

UART1 用做 用户的 printf, UART2 用做 系统的 Taskmgr, 原因不多解释,总之分开好。  详情 回复 发表于 2024-8-30 21:35
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2024-8-22 13:39:12 | 显示全部楼层
目前遇到了没有正常运行任务,望楼主能为我解惑
  1. #include "os_link.h"
  2. #include "stdio.h"
  3. #define TEST_TASKSTACKSIZE 64
  4. uCreateTask(task_2, 1, TEST_TASKSTACKSIZE, 0, 0)
  5. {
  6.         static unsigned int i = 0;
  7.         //uDelay_s(5);
  8.         printf("task_2: %u\r\n", ++i);
  9.         uEndTasking;
  10. }
  11. int main(void)
  12. {
  13.         void s_init_timing(void);
  14.         #if SYSCFG_SAFERUNTIME == __ENABLED__
  15.         s_tid_t i;
  16.         for(i = 0; i < OS_TASKTOTAL + 1; i++){
  17.                 s_sign_timeout[i] = 0;
  18.         }
  19.         #endif
  20.         #if OS_TIMINTTOTAL || OS_TIMQRYTOTAL
  21.         s_init_timing();
  22.         #endif
  23.         init_hook();
  24.         printf("init hook ok\r\n");
  25.         mSys_INIT;
  26.         printf("init syscfg ok\r\n");
  27.        
  28.         #if SYSCFG_DEBUGGING == __ENABLED__
  29.         sStartTask_TimQry(OS_TMID_TASKMGR);
  30.         #endif
  31.         uStartTask(Starter, OS_STATUS_READY);        // 启动任务
  32.         uStartTask(Sysidle, OS_STATUS_READY);        // 空闲任务
  33.         uStartTask_Ready(task_2);                                // 启动用户任务
  34.        
  35.         while(true);
  36. }
复制代码

打印的时候,只打印了main()里面的两句话,而任务里头的语句没有打印。即便是将空闲任务与用户任务交换位置,串口也是没有输出。我试过在 idle_hook 中放置打印也是没有任何输出,上电的时候,就两句话,以下是 log
init hook ok

init syscfg ok

init hook ok

init syscfg ok

点评

启动你自己的任务,不要在 main()中,而是在 启动钩子 start_hook()中, 这样就会一切正常了。 你可以看一下test程序,都是这样的。  详情 回复 发表于 2024-8-30 21:17
回复 支持 反对

使用道具 举报 送花

2

主题

14

回帖

125

积分

注册会员

积分
125
发表于 2024-8-23 16:11:18 | 显示全部楼层
大佬好,我在编程过程中,遇到中断地址与PendSV中断地址冲突的问题。在程序中,所有含有可位寻址中断标志位的中断(INT0,TIMER0,INT1,TIMER1)都被我使用,剩下的中断都不能位寻址。图中清除标志位时需要使用汇编语言直接清除bit位,如果换成其他中断,就不能直接修改bit位,程序会报错。这个问题怎么解决?
截图202408231601592213.jpg

点评

我给你个示例,PendSV 用 INT4 替换:  详情 回复 发表于 2024-8-30 20:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2024-8-23 22:06:51 | 显示全部楼层
etha*** 发表于 2024-8-23 16:11
大佬好,我在编程过程中,遇到中断地址与PendSV中断地址冲突的问题。在程序中,所有含有可位寻址中断标志位 ...

C语言文件你插入汇编肯定是会报错的吧。你不能按位寻址,那就写个宏函数来操作中断地址中的某个 bit 啊,我都是这么解决的
  1. #define BIT_SET_ZERO(src, cnt) src &= ~(1 << cnt) // 给 src 左移 cnt位写0
  2. #define BIT_SET_ONE(src, cnt) src |= (1 << cnt) // 给 src 左移 cnt 位写1
  3. #define FIND_BIT(src, cnt) (src & (1 << cnt)) // 找 src 中左移 cnt 位的 1
复制代码
回复 支持 反对

使用道具 举报 送花

2

主题

14

回帖

125

积分

注册会员

积分
125
发表于 2024-8-28 18:17:53 | 显示全部楼层
请问,对于STC8H,putchar的重定向函数在哪里。我找了许久未找到,只看到stdio.h中有声明。我需要把printf调整到串口2上?其次,在5月20号的课程文档里面只有PPT没有工程。

点评

STC8H,putchar函数用的是标准库的,没有重定向。 你printf调整为其它串口,就自己重定向吧。 可以下载最新版的 工程模板,里面的 test 是目前最全面的示例。  详情 回复 发表于 2024-8-30 19:51
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-8-30 19:45:44 | 显示全部楼层
由于前段时间升级电脑,今日刚刚完工,
导致未能及时回复大家提出的问题,深表歉意!
接下来,我依次回复大家的问题。

回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-8-30 19:51:33 | 显示全部楼层
etha*** 发表于 2024-8-28 18:17
请问,对于STC8H,putchar的重定向函数在哪里。我找了许久未找到,只看到stdio.h中有声明。我需要把printf ...

STC8H,putchar函数用的是标准库的,没有重定向。
你printf调整为其它串口,就自己重定向吧。
可以下载最新版的 工程模板,里面的 test 是目前最全面的示例。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-8-30 20:38:51 | 显示全部楼层
本帖最后由 CosyOS 于 2024-8-30 21:04 编辑
etha*** 发表于 2024-8-23 16:11
大佬好,我在编程过程中,遇到中断地址与PendSV中断地址冲突的问题。在程序中,所有含有可位寻址中断标志位 ...

我给你个示例,PendSV 用 INT4 替换:

截图202408302040515555.jpg


其中,EX4、INT4IF 是 宏定义的:
截图202408302042196655.jpg


此时,本应 #define mPendSV_Clear  为  AUXINTIF &=~INT4IF,
但由于需用汇编,所以应该,#define mPendSV_Clear  为  ANL AUXINTIF, #0xBF,
但由于 宏定义中不能出现 #,
所以,可以 #define mPendSV_Clear 为空,或注释掉它,
而后在 port_8051s.s 中,直接把 mPendSV_Clear 替换为 ANL AUXINTIF, #0xBF。
截图202408302053146236.jpg

mPendSV_Clear 的引用,仅此一处,暂时就用这个办法吧。


另外需注意,对于STC8,可能很多中断都无法用作 PendSV。
因为PendSV的替代中断需满足一个条件,
在关闭该中断的前提下,置中断标志位后再开启中断,得能响应中断。
判断方法,可以先用 INT0 做为 PendSV(一定能好用),待 任务能正常运行了,
再替换为其它中断,如果替换后任务不能运行,证明该中断不适用。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-8-30 21:17:29 | 显示全部楼层
本帖最后由 CosyOS 于 2024-8-30 21:19 编辑
王*** 发表于 2024-8-22 13:39
目前遇到了没有正常运行任务,望楼主能为我解惑

打印的时候,只打印了main()里面的两句话,而任务里头的语 ...

启动你自己的任务,不要在 main()中,而是在 启动钩子 start_hook()中,
这样就会一切正常了。
你可以看一下test程序,都是这样的。
其实,设计理念就是 main()完全由OS管理,用户不要动它。

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-5 20:22 , Processed in 0.131140 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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