CosyOS
发表于 2024-11-2 18:00:13
sdwys 发表于 2024-11-2 16:29
这个结构体定义的东西大多数能模糊的知道做什么用,于是让AI来分析了下,作者看看AI分析的正确吗?
...
八成是差不多的,但一些细节还不够准确。
Matrix
发表于 2024-11-3 08:30:38
{:4_165:}{:4_165:}{:4_165:}
sdwys
发表于 2024-11-3 10:58:17
本帖最后由 CosyOS 于 2024-11-3 15:34 编辑
这三种队列分别在什么情况下使用?
/**
\brief 队列控制块
\detail 静态队列与动态队列通用的控制块。
创建队列时,并不会定义此控制块;
访问队列时,通过引用指向此控制块的指针(句柄),可访问不同类型(静态、动态)的队列控制块。
*/
typedef struct
{
size_t counter;
const s_u8_t type;
const s_u8_t mode;
const size_t len;
s_tasknode_tsp node;
volatile s_bool_t mutex;
}s_queue_ts;
typedef s_queue_ts _STATIC_MEM_ *s_queue_tsp; /*!< 队列句柄 */
/**
\brief 静态队列控制块
\detail 创建静态队列时,会定义此控制块。
*/
typedef struct
{
size_t counter;
const s_u8_t type;
const s_u8_t mode;
const size_t len;
s_tasknode_tsp node;
volatile s_bool_t mutex;
void * _STATIC_MEM_ * head;
void * _STATIC_MEM_ * tail;
void * _STATIC_MEM_ * const base;
}ss_queue_ts;
typedef ss_queue_ts _STATIC_MEM_ *ss_queue_tsp; /*!< 队列句柄 */
/**
\brief 动态队列控制块
\detail 创建动态队列时,会定义此控制块。
*/
typedef struct
{
size_t counter;
const s_u8_t type;
const s_u8_t mode;
const size_t len;
s_tasknode_tsp node;
volatile s_bool_t mutex;
s_msgnode_tsp head;
s_msgnode_tsp tail;
}sd_queue_ts;
typedef sd_queue_ts _STATIC_MEM_ *sd_queue_tsp;/*!< 队列句柄 */
CosyOS
发表于 2024-11-3 15:41:55
sdwys 发表于 2024-11-3 10:58
这三种队列分别在什么情况下使用?
/**
1、创建队列时,队列名称 就是 该队列控制块的名称。
/* 创建静态消息队列 */
#define sCSV_CreateQueue(name, mode, len) \
void *u_queue_##name; \
ss_queue_ts name = {0, __STATIC__, mode, len, OS_NULL, true, u_queue_##name, u_queue_##name + len - 1, u_queue_##name}
/* 创建动态消息队列 */
#define dCSV_CreateQueue(name, mode, len) \
sd_queue_ts name = {0, __DYNAMIC__, mode, len, OS_NULL, true, OS_NULL, OS_NULL}
2、访问队列时,队列名称取址再转换为 s_queue_tsp 类型,便可访问队列控制块,无论是静态还是动态皆可。
/* 接收消息 */
#define uRecvMsg(que, tc)sUSV_RecvMsg((s_queue_tsp)&que, tc)
/* 发送消息 */
#define uSendMsg(que, msg) sUSV_SendMsg((s_queue_tsp)&que, msg)
DIY365
发表于 2024-11-4 09:52:14
请教一个问题,串口1接收Buffer清空数组里面数据的问题。
我现在串口1已经能够接收到数据了。但是我想清空buffer里面的数据。程序就会卡死不动了。
CosyOS
发表于 2024-11-4 11:56:54
本帖最后由 CosyOS 于 2024-11-4 12:57 编辑
DIY365 发表于 2024-11-4 09:52
请教一个问题,串口1接收Buffer清空数组里面数据的问题。
我现在串口1已经能够接收到数据了。但是我想清空b ...
这个需要结合整体来看,仅看这两段代码,无法确定原因。
memset 是可重入函数,你的写法也没有问题。
1、其它任务是否也访问了 DMABuffer?如其它任务做接收解析,导致 DMABuffer 重入?
2、task_1 中 memset 过程中,是否可能进入 UART1接收中断,导致 DMABuffer 重入?
是否可能是 DMABuffer 重入导致的异常?
另外,建议你 DMABuffer 为 255,
u8 xdata DMABuffer;
u8 Rx_cnt;
if(RI){
RI = 0;
if(Rx_cnt < 255) DMABuffer = SBUF;
...
如果 DMABuffer 必须大于255,那 RX_cnt 为 u8 会溢出的,应改为u16.
有时,出问题貌似与XX有关,但也未必,真正的原因可能与XX毫无关系,
只是时间上的恰到好处,正赶上XX运行的时候出的问题。所以,不能只
盯着 memset、DMABuffer,而应着眼于全局。
sdwys
发表于 2024-11-5 11:07:05
*ptr++ = var /**/+ '0';
Lable_1: *ptr++ = (var % 10) /**/+ '0';
这几个表达式注释加在中间是书写错误还是就是这样,如果就是这样,请作者解惑?
giveyou
发表于 2024-11-5 14:09:25
CosyOS-II 最新版_说明文档.zip下载学习中
CosyOS
发表于 2024-11-5 14:22:33
本帖最后由 CosyOS 于 2024-11-5 14:25 编辑
sdwys 发表于 2024-11-5 11:07
*ptr++ = var /**/+ '0';
Lable_1: *ptr++ = (var % 10) /**/+ '0';
这个“空注释”仅是用来实现上下行代码的空间布局,使其形成一种队形,
玩的完全是感觉,没有特殊的作用,可以删除掉。如:
这样写:
Lable_4: *ptr++ = (var % 10000) / 1000 + '0';
Lable_3: *ptr++ = (var % 1000) / 100 + '0';
Lable_2: *ptr++ = (var % 100) / 10 + '0';
Lable_1: *ptr++ = (var % 10) + '0';
显得不够优雅;
这样写:
Lable_4: *ptr++ = (var % 10000) / 1000 + '0';
Lable_3: *ptr++ = (var % 1000) / 100 + '0';
Lable_2: *ptr++ = (var % 100) / 10 + '0';
Lable_1: *ptr++ = (var % 10) / 1 + '0';
就比较优雅了!
但 有些编译器(我记得是 C251)不支持 /1 的写法,会有警告或错误;
所以就这样写:
Lable_4: *ptr++ = (var % 10000) / 1000 + '0';
Lable_3: *ptr++ = (var % 1000) / 100 + '0';
Lable_2: *ptr++ = (var % 100) / 10 + '0';
Lable_1: *ptr++ = (var % 10) /**/+ '0';
与 /1 的写法保持相同的队形。
bug 是没有的,不用纠结!
sdwys
发表于 2024-11-5 23:19:22
作者能否抽时间做个这样的文档,用 思维导图 的形式将MCU上电后开始到进入系统,创建任务,运行任务等所有步骤,用到的函数等信息都画出来,让人一看就有一种掌握全局的感觉。例如图片所示: