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上电后开始到进入系统,创建任务,运行任务等所有步骤,用到的函数等信息都画出来,让人一看就有一种掌握全局的感觉。例如图片所示:
页: 86 87 88 89 90 91 92 93 94 95 [96] 97 98 99 100 101 102 103 104 105
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板