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

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

 火... [复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:35
  • 最近打卡:2025-06-28 11:41:48

4

主题

78

回帖

674

积分

高级会员

积分
674
发表于 2025-5-9 11:01:29 | 显示全部楼层
神*** 发表于 2025-5-8 13:39
GIT 没给我们广告费,所以直接去了

幽默
希望这个世界让我装一次B
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-30 09:00:10
已绑定手机

0

主题

46

回帖

408

积分

中级会员

积分
408
发表于 2025-5-9 14:01:33 | 显示全部楼层
打卡加油
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-06-21 11:38:26

2

主题

59

回帖

564

积分

高级会员

积分
564
发表于 2025-5-10 16:10:33 | 显示全部楼层
源码
s_ecode_t uStartCosyOS(void)

{      
    s_ecode_t _ecode;        
    uExternTask(Sysidle);        
    sCat2Str(SYSCFG_STARTERCREATE, ExternTask(Starter));        
    #if OS_TIMINTTOTAL || OS_TIMQRYTOTAL        
    void os_init_timing(void);        
    os_init_timing();      
    #endif        
    mCosyOS_INIT();

----------------------------------------------------
汇编
24: s_ecode_t uStartCosyOS(void)     

25: {     
26:         s_ecode_t _ecode;   
27:         uExternTask(Sysidle);   
28:         sCat2Str(SYSCFG_STARTERCREATE, ExternTask(Starter));   
29:         #if OS_TIMINTTOTAL || OS_TIMQRYTOTAL     
30:         void os_init_timing(void);     
31:         os_init_timing();     
32:         #endif
0xFF31F0   12387F      LCALL    os_init_timing(C:0x387F)   
33:         mCosyOS_INIT();
0xFF31F3   7E080B00    MOV      DR0,#0x0B00

下面这两句都没有生成代码,扩展后只是宏定义,为什么要这样写?
uExternTask(Sysidle);
sCat2Str(SYSCFG_STARTERCREATE, ExternTask(Starter));
/**
\brief      声明静态创建的任务
\param[in]  task      任务名称
\return     无
*/
#define uExternTask(task) \
    sCSV_ExternTask(task)

/** 声明静态任务 */
#define sCSV_ExternTask(name) \
    void name(void); \
    extern s_tasknode_ts u_taskhand_##name; \
    extern s_tasknode_tsp u_taskhandle_##name
-----------------------------------------------------------
* SYSAPI */

#define sDefStr(s)              sDefStr_0(s)
#define sDefStr_0(s)            #s

#define sCat2Str(s1, s2)        sCat2Str_0(s1, s2)
#define sCat2Str_0(s1, s2)      s1##s2

#define sCat3Str(s1, s2, s3)    sCat3Str_0(s1, s2, s3)
#define sCat3Str_0(s1, s2, s3)  s1##s2##s3
这几个应该是连接字符串的定义吧?






点评

这两句是在声明任务,宏替换之后就是声明相关变量,当然不会有汇编代码了。 ##是字符串拼接,实现用宏参数来写代码,高级的作品经常都会采用这种写法, 看多了就不奇怪了  详情 回复 发表于 2025-5-10 17:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:472
  • 最近打卡:2025-06-27 16:25:11

5

主题

1154

回帖

4509

积分

荣誉版主

积分
4509
发表于 2025-5-10 17:38:04 | 显示全部楼层
sdw*** 发表于 2025-5-10 16:10
源码
s_ecode_t uStartCosyOS(void)
{      

这两句是在声明任务,宏替换之后就是声明相关变量,当然不会有汇编代码了。
##是字符串拼接,实现用宏参数来写代码,高级的作品经常都会采用这种写法,
看多了就不奇怪了

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:150
  • 最近打卡:2025-06-30 21:36:21
已绑定手机

6

主题

122

回帖

585

积分

高级会员

积分
585
发表于 2025-5-10 20:08:17 | 显示全部楼层
用试验箱搞个示波器玩玩
学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-06-21 11:38:26

2

主题

59

回帖

564

积分

高级会员

积分
564
发表于 2025-5-10 23:32:17 | 显示全部楼层
Cos*** 发表于 2025-5-10 17:38
这两句是在声明任务,宏替换之后就是声明相关变量,当然不会有汇编代码了。
##是字符串拼接,实现用宏参数 ...
是不是这样扩展

uExternTask(Sysidle);

/**
\brief      声明静态创建的任务
\param[in]  task      任务名称
\return     无
*/
#define uExternTask(task) \
    sCSV_ExternTask(task)

扩展到:
sCSV_ExternTask(Sysidle);

/** 声明静态任务 */
#define sCSV_ExternTask(name) \
        void name(void); \
        extern s_tasknode_ts u_taskhand_##name; \
        extern s_tasknode_tsp u_taskhandle_##name

最终扩展到:
void Sysidle(void);
extern s_tasknode_ts u_taskhand_Sysidle;
extern s_tasknode_tsp u_taskhandle_Sysidle;
//--------------------------------------------------------
//--------------------------------------------------------
sCat2Str(SYSCFG_STARTERCREATE, ExternTask(Starter));

// <o> Starter-创建模式
// <0=> 静态创建 <1=> 动态创建
// <i> 一般情况下,推荐采用动态创建,Starter删除自身后,内存可被回收;
// <i> 但用户千万不要忘记配置足够大的内存池或HEAP。
#define __SYSCFG_STARTERCREATE           1

#if __SYSCFG_STARTERCREATE == 0
#define SYSCFG_STARTERCREATE u
#else
#define SYSCFG_STARTERCREATE d
#endif

#define sCat2Str(s1, s2)        sCat2Str_0(s1, s2)
#define sCat2Str_0(s1, s2)      s1##s2

扩展到:
sCat2Str(d, ExternTask(Starter));

dExternTask(Starter);

/**
\brief      声明动态创建的任务
\param[in]  task      任务名称
\return     无
*/
#define dExternTask(task) \
    dCSV_ExternTask(task)
        
扩展到:
dCSV_ExternTask(Starter)

/** 声明动态任务 */
#define dCSV_ExternTask(name) \
        void name(void); \
        extern s_taskhand_ts u_taskhand_##name; \
        extern s_tasknode_tsp u_taskhandle_##name
        
        
最终扩展到:        
void Starter(void);
extern s_taskhand_ts u_taskhand_Starter;
extern s_tasknode_tsp u_taskhandle_Starter;
//----------------------------------------------------------------------------
void Sysidle(void);

void Starter(void);

这两个函数声明,没找到函数定义在什么地方。

点评

是这样的,你分析的都对, 这两个函数就是这两个任务函数啊, 分别在 os_starter.c、os_sysidle.c 中,里面的创建任务之中。 例如: uCreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname) { /* 任  详情 回复 发表于 2025-5-11 16:53
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:180
  • 最近打卡:2025-06-30 11:01:37
已绑定手机

2

主题

112

回帖

296

积分

中级会员

积分
296
发表于 2025-5-11 10:35:48 | 显示全部楼层
学习
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:472
  • 最近打卡:2025-06-27 16:25:11

5

主题

1154

回帖

4509

积分

荣誉版主

积分
4509
发表于 2025-5-11 16:53:22 | 显示全部楼层
sdw*** 发表于 2025-5-10 23:32
是不是这样扩展

uExternTask(Sysidle);

是这样的,你分析的都对,
这两个函数就是这两个任务函数啊,
分别在 os_starter.c、os_sysidle.c 中,里面的创建任务之中。
例如:
uCreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname)
{
    /* 任务代码 */
}
uCreateTask 宏替换的最后就是定义Sysidle这个任务函数,而后就接着写任务代码了。。。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-06-21 11:38:26

2

主题

59

回帖

564

积分

高级会员

积分
564
发表于 2025-5-12 17:14:30 | 显示全部楼层
Sysidle函数创建过程是不是这样?

//uCreateTask(任务名称, 任务优先级, 任务栈大小, 安全运行时, 保留)

uCreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname)
{
        /**...**/
}


/***************************************************************************/
/**
\brief      静态创建一般任务
\param[in]  task      任务名称
\param[in]  pri       任务优先级
\param[in]  tss       任务栈大小(单位为字节)
\param[in]  srt       安全运行时(单位为时间片,0为无限长)
\param[in]  res       保留
\param[in]  add{...}  附加任务代码
\ret
urn     无
*/

#define uCreateTask(task, pri, tss, srt, res) \
        sCSV_CreateTask(task, pri, tss, srt, res)

        
/***************************************************************************/

/**
\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; /*!< 任务句柄 */


/*
* 创建任务
*/
/** 静态创建,启用 DEBUGGING,启用 安全运行时 */

                #define sCSV_CreateTask(name, pri, tss, srt, res) \
                        void name(void); \
                        s_tasknode_ts u_taskhand_##name; \
                        s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \
                        MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
                        s_tasknode_ts u_taskhand_##name = {0, pri, tss, &u_taskhandle_##name, name, res ? res : #name, srt, u_taskstack_##name, 0}; \
                        void name(void)

//-----------------------------------------------------------------
// uCreateTask(任务名称, 任务优先级, 任务栈大小, 安全运行时, 保留)

// uCreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname)

// sCSV_CreateTask(任务名称, 任务优先级, 任务栈大小, 安全运行时, 保留)
        
// sCSV_CreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname)

uCreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname)
{
        /**...**/
}

//最终扩展为:        

void Sysidle(void);

s_tasknode_ts u_taskhand_Sysidle;

s_tasknode_tsp u_taskhandle_Sysidle = &u_taskhand_Sysidle;

MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_Sysidle[SYSCFG_STACKSIZE_SYSIDLE];

s_tasknode_ts u_taskhand_Sysidle = {0, 0, SYSCFG_STACKSIZE_SYSIDLE, &u_taskhandle_Sysidle, Sysidle, _taskname ? _taskname : Sysidle, 0, u_taskstack_Sysidle, 0};

void Sysidle(void)
{
         /**...**/
}

点评

是的,恭喜你又猜对了,  详情 回复 发表于 2025-5-12 22:13
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:472
  • 最近打卡:2025-06-27 16:25:11

5

主题

1154

回帖

4509

积分

荣誉版主

积分
4509
发表于 2025-5-12 22:13:32 | 显示全部楼层
sdw*** 发表于 2025-5-12 17:14
Sysidle函数创建过程是不是这样?

//uCreateTask(任务名称, 任务优先级, 任务栈大小, 安全运行时, 保留)

是的,恭喜你又猜对了,
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-1 01:03 , Processed in 0.135666 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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