Yang.Lian 发表于 2025-5-9 11:01:29

神农鼎 发表于 2025-5-8 13:39
GIT 没给我们广告费,所以直接去了

幽默{:ciya:}

Istar_MCU 发表于 2025-5-9 14:01:33

打卡加油

sdwys 发表于 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
这几个应该是连接字符串的定义吧?





CosyOS 发表于 2025-5-10 17:38:04

sdwys 发表于 2025-5-10 16:10
源码
s_ecode_t uStartCosyOS(void)
{      

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

patch1582 发表于 2025-5-10 20:08:17

用试验箱搞个示波器玩玩

sdwys 发表于 2025-5-10 23:32:17

CosyOS 发表于 2025-5-10 17:38
这两句是在声明任务,宏替换之后就是声明相关变量,当然不会有汇编代码了。
##是字符串拼接,实现用宏参数 ...是不是这样扩展

uExternTask(Sysidle);

/**
\brief      声明静态创建的任务
\paramtask      任务名称
\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      声明动态创建的任务
\paramtask      任务名称
\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);

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

lgnstar 发表于 2025-5-11 10:35:48

学习 {:qiang:}

CosyOS 发表于 2025-5-11 16:53:22

sdwys 发表于 2025-5-10 23:32
是不是这样扩展

uExternTask(Sysidle);

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


sdwys 发表于 2025-5-12 17:14:30

Sysidle函数创建过程是不是这样?

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

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

/***************************************************************************/
/**
\brief      静态创建一般任务
\paramtask      任务名称
\parampri       任务优先级
\paramtss       任务栈大小(单位为字节)
\paramsrt       安全运行时(单位为时间片,0为无限长)
\paramres       保留
\paramadd{...}附加任务代码
\return   无
*/
#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;       /*!< 任务创建 */
                                                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;/*!< 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; \
                        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)
{
         /**...**/
}

CosyOS 发表于 2025-5-12 22:13:32

sdwys 发表于 2025-5-12 17:14
Sysidle函数创建过程是不是这样?

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


是的,恭喜你又猜对了,{:weixiao:}
页: 99 100 101 102 103 104 105 106 107 108 [109] 110 111 112 113 114
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板