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:}