• [问题求助] 买了小熊派开发板,按照例程跑LiteOS的helloworlddemo,串口就是没有打印出信息 买了小熊派开发板,按照例程跑Li
    买了小熊派开发板,按照例程跑LiteOS的helloworlddemo,程序编译和烧录正常,开发板的显示屏也显示出了字符串但是串口就是没有打印出信息,请问这是什么问题?
  • [问题求助] 买了小熊派开发板,按照例程跑LiteOS的helloworlddemo,串口就是没有打印出信息
    买了小熊派开发板,按照例程跑LiteOS的helloworlddemo,程序编译和烧录正常,开发板的显示屏也显示出了字符串但是串口就是没有打印出信息,请问这是什么问题?
  • [问题求助] LiteOS基于小熊派开发板的模版工程中user_demo.mk文件的变量定义问题求解
    如下图所示,user_demo_defs变量这句话大概意思是什么?
  • [最新动态] 【汇总帖】Huawei LiteOS设备开发实战营
    朋友们!新的一年,新的训练营这训练营的主角是>>>Huawei LiteOS!大家激不激动,开不开心!!!本课程限时免费开放,参与活动还有各种大奖等你拿哦!直接告诉大家坚持到最后的奖品吧(结业证书/华为GT 2手表/HCIA考券/开发板/音响等等)报名时间:2020.4.10-2020.4.29打卡时间:2020.4.21-2020.4.29活动报名链接>>>【Huawei LiteOS设备开发实战营】活动活动信息开始时间课程链接作业提交第一天进行产品开发和MQTT.fx调测2020.4.21待更新点击提交作业第二天移植Huawei LiteOS内核2020.4.22待更新点击提交作业第三天移植Huawei LiteOS传感器2020.4.23待更新点击提交作业第四天移植Huawei LiteOS通信模组2020.4.24待更新点击提交作业第五天移植Huawei LiteOS通信协议2020.4.27待更新点击提交作业第六天定制IoT开发套件LCD屏显2020.4.28待更新点击提交作业第七天发表学习 总结与感言2020.4.29待更新点击提交作业其他说明:1. 班主任会对每天的成功任务截图进行确认并登记,只有前序所有关卡都成功,才可在第1/4/7天领取相应福利;3. 在成功打卡第1/4/7天后,根据所在楼层确认抽奖号码(如在7楼打卡,则抽奖号码为7号),请尽量只打卡一次;4. 第1/4/7天抽奖,班主任先和所有学员确认抽奖号码,第二天直播抽奖;5. 特别奖根据第7天(前6天皆完成打卡)获奖感言回帖数进行排名发放,请不要进行刷楼(每人最多在学员发表的活动感言帖中回复5次),一经发现,取消获奖资格;6. 所有实物礼品将会在活动结束后15个工作日内发放。7.【华为云社区常规活动规则】https://bbs.huaweicloud.com/forum/thread-5766-1-1.html
  • [技术干货] HDC | 漫谈LiteOS-常用开发板
    摘要:本文主要介绍物联网中目前较为常用的2款开发板,简单介绍一下各自的特点,希望对你有所帮助。1 引言众所周知开发板是物联网架构中的感知层智能设备,这类设备通常有芯片、通信模组、以及操作系统组成。当然不同的开发版在功能以及使用上可能存在着一定的差别,下面为大家介绍几款常用的物联网开发板。2 常用开发板2.1 小熊派开发板与传统传感器不同的是,小熊派开发板没有板载传感器设计,为了满足不同的开发需求,该开发板采用可更换传感器扩展板设计,芯片指的是设备的主控芯片,该开发板搭载了一块低功耗的STM32L4单片机,通信模组 是数据传输的出入口,本开发板支持多种通信模组,采用可更换通信扩展板设计,包括WiFi,NBiot,2G ,4G等,liteos轻量级系统,支持串口,8MSPi flash,支持TF卡存储运行数据,240的分辨率lcd,显示传感器数据以及调试日志,AT-PC切换开关,电脑通过串口助手进行调试通信模组,右侧MCU模式,单片机MCU通过At指令与通信模组交互将传感器数据传输到云端。为了便于开发调试,如图所示,该开发板板载了2.1版本的ST-Link,它具有在线调试烧录,拖拽下载以及虚拟串口等功能。开发板左上角内置了一个TF卡卡槽,TF卡可以存储运行数据,其左侧有一个8M的SPI Flash,使用其方便对程序进行远程升级。开发板中间板载一块分辨率为240 * 240的LCD屏幕,其主要用于显示传感器数据以及调试日志。LCD屏幕下方是一个基于STM32L431的超低功耗单片机作为开发板的主控芯片。开发板右上角具有一个拨码开关,将其拨至左侧AT-PC模式,通过电脑端的串口助手,发送AT指令调试通信模组。右边AT-MCU模式,通过MCU发送AT指令与通信模组进行交互,将采集到的传感器数据通过通信模组发送到云端。同时小熊派IoT开发板在主板上引出21个IO口,具备IIC、SPI、USART、ADC、DAC等功能,可最大程度地满足开发者的自主开发需求。主要参数如下表:参数详情存储Flash:256K   SRAM:64KBSD卡系统支持32GB的SD卡存储扩展外扩Flash外扩8MB SPIFlash按键一个复位键,两个功能按键供电USB 5V或外部电源5VLED灯上电指示LED红色,下载指示LED橙色,一个用户定义LED,蓝色。2.2 STM32F429 野火开发板STM32F429野火挑战者开发板,共有两个版本,二者存在一定差异,挑战者开发板是主控芯片是Cortex-M4系列, STM32F429IGTx,具有 1MB Flash,192kB SRAM+64CCM RAM,系统时钟达到 180MHz。板载 SDRAM:64M. SPI FLASH: 16M。EEPROM : 256 B。SD 卡:Micro SD卡接口,最大支持 32G 容量。实物图如下所示。2.2.1 供电方式5V 供电: 2个 MicroUSB 接口。6-12V 供电:DC电源接口,可接 6-12V电源适配器。2.2.2通讯方式该开发板主要包括以太网接口,232串口通讯(带DB9母接口),USB转串口通讯,带Mini USB接口。USB主设备读取U盘文件,USB从设备,模拟U盘,CAN通讯、485通讯,皆带接线端子。 红外通讯:红外接收头接口。蓝牙串口。WIFI: EMW1062,可实现 wifi传输视频,板载天线。音频输出接口。2.2.3 其他硬件LCD:支持5寸屏,分辨率为800*480.LED灯:1个,1个RGB全彩灯。按键:3个实体按键,1个电容按键。程序下载接口:  JTAG接口、  SWD 接口:支持 DAP、JLink、ULink、STLink 下载器。传感器:温湿度传感
  • [问题求助] 【请问LiteOS是否有类似Linux设备树的功能特性?多谢!】
    当前在开发一款产品,使用MCU来管理硬件器件,OS准备使用LiteOS。考虑到后期会持续开发新产品,MCU软件使用同一套代码,为了保持代码架构持续稳定健康,准备参考使用Linux设备树来实现。 请问LiteOS上是否有类似Linux设备树的功能特性?还是只能自行实现类似机制?针对这种使用场景,LiteOS团队有没有相关推荐特性或建议?谢谢!
  • [内容拦截申诉] 移植LiteOS时,在GitHub下载源码时,是下载develop分支还是dev-deserted分支?帖子误拦截,请通过,谢谢
    发文的版块名:热门技术领域-IoT物联网-小熊派发文的标题名:【论坛】[技术探讨]移植LiteOS时,在GitHub下载源码时,是下载develop分支还是dev-deserted分支?帖子内容链接:https://bbs.huaweicloud.com/forum/thread-48559-1-1.html
  • [问题求助] 华为LiteOS精简内核在哪个文件里面?
    我使用的硬件为GD32VF103C8T6,flash大小只有64Kb,编译华为IoT-Studio的例子,生成bin文件就有60KB了,我写了一些程序之后,编译输出的bin文件大于64KB了,请问在哪个文件里面精简内核呢?
  • [问题求助] liteos 中的文件系统组件如何使用
    我想使用liteos中的fatfs组件来管理外部存储介质比如flash或者sd卡,应该如何操作呢
  • [问题求助] LiteOS是否可以支持类似Android一样,在MCU上开发客户应用呢?
    你好。我有个客户需求,帮助客户奖传感数据联网传送至云端,但是客户对采集到的传感数据,需要自己做处理、判断后,再讲数据上传。在这种情况下,我希望提供基础解决方案给到客户,然后客户在此基础上,开发自己的数据处理应用。有没有可能,类似于我提供一台移植了LiteOS的MCU+联网单元,由客户在上面开发类似X应用的方式实现我的功能要求呢。即类似于Android手机是一个处理器
  • [问题求助] 【求助】LiteOS在GD MCU上移植后,概率性发生消息队列满的问题
    问题描述:LiteOS版本Huawei LiteOS Kernel V200R001c50B038LiteOS创建一个消息处理的任务MessageTask,处理g_sm_message_queue消息队列消息,MCU收到SMBUS中断消息后,会把消息put进这个消息队列,消息队列深度10。  在升级固件的场景,概率发生消息队列满的现象,在发生队列满之后调用LOS_QueueInfoGet接口把队列的状态信息打印出来如下:usQueueLen:a      usQueueSize:8                                                                   usQueueHead:1                                                                   usQueueTail:1                                                                   usWritableCnt:0                                                                 usReadableCnt:9                                                                 uwWaitReadTask:0                                                                uwWaitWriteTask:0                                                               uwWaitMemTask:0发现uwWaitReadTask变成了0,正常情况下都是8(因为消息接收任务ID是3,所以是8),从源码看,应该是没有读取消息的任务,导致了队列满。typedef struct tagQueueInfo{    UINT32     uwQueueID;                       /**< Queue ID                   */    UINT16     usQueueLen;                      /**< Queue length               */    UINT16     usQueueSize;                     /**< Node size                  */    UINT16     usQueueHead;                     /**< Node head                  */    UINT16     usQueueTail;                     /**< Node tail                  */    UINT16     usWritableCnt;                   /**< Count of writable resources               */    UINT16     usReadableCnt;                   /**< Count of readable resources               */    UINT32     uwWaitReadTask;                  /**< Resource reading task                     */    UINT32     uwWaitWriteTask;                 /**< Resource writing task                     */    UINT32     uwWaitMemTask;                   /**< Memory task                               */} QUEUE_INFO_S; 此时,查询任务的状态:[ERR] Swt_Task                      , 0x0    , 0          , QueuePend    , 0x1000       , 0xd8         , 0x20006528  , 0x20005600   , 0x0        [ERR] 0xffff   [ERR]                                         [ERR] IdleCore000                   , 0x1    , 31         , Ready        , 0x500        , 0x58         , 0x20006ab8  , 0x20006610   , 0x0        [ERR] 0xffff   [ERR]                                   [ERR] MainTaskName                 , 0x2    , 4          , Ready        , 0x800        , 0x3e8        , 0x20007208  , 0x20006b20   , 0x0        [ERR] 0xffff   [ERR]                             [ERR] MessageTaskName             , 0x3    , 3          , Ready        , 0x800        , 0x308        , 0x20007a38  , 0x20007330   , 0x0        [ERR] 0xffff   [ERR]        //正常状态               [ERR] ConsoleTaskName               , 0x4    , 4          , Running      , 0x400        , 0x218        , 0x20007dc8  , 0x20007b40   , 0x0        [ERR] 0xffff   [ERR]                 [ERR] OpFlashTaskName               , 0x5    , 4          , QueuePend    , 0x400        , 0x240        , 0x20008258  , 0x20007f50   , 0x0        [ERR] 0xffff   [ERR]           [ERR] WdtTaskName                   , 0x6    , 2          , Delay        , 0x100        , 0x88         , 0x200083d8  , 0x20008360   , 0x0        [ERR] 0xffff   [ERR]     LiteOs Memory status                                                                [ERR] pool0 :    [ERR] pool addr    pool size    total size     used size    free size   alloc Count    free Count                                                  0x20003b98   0xc468       0x3004        0x91f0       0x3004      0x39               0xa说明任务并会没有退出,而是消息队列中控制读取消息任务的状态异常,导致消息不处理了。之前怀疑过栈溢出、消息处理不及时等原因,但都被排除了现在没有思路了,请大家帮忙分析下?感谢!
  • [技术干货] HDC.Cloud | 漫谈LiteOS-STM32与GD32简单对比
    摘要:本文主要对STM32与GD32进行简单的对比,二者功能上大体相同,希望通过对上面的简单介绍方便用户在不同需求下选择对应的芯片。1 STM321.1 STM32 介绍STM32系列开发板由 意法半导体(STMicroelectronics) 有限公司,意法半导体是世界最大的半导体公司之一。从成立之初至今,ST 的增长速度超过了半导体工业的整体增长速度。STM32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的ARM Cortex®-M0,M0+,M3, M4和M7内核等系列产品.1.2分类按内核架构分为不同产品:(1)主流产品(STM32F0、STM32F1、STM32F3)(2)超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)(3)高性能产品(STM32F2、STM32F4、STM32F7、STM32H7) 1.3 STM32共有特性STM32开发板都具有通信串口如USART,SPI,I2C等,都具备多通道的DMA控制器、通用定时器、外部存储器接口、看门狗和RTC、时钟电路、主振荡器和32kHz振荡器、温度传感器等.2 GD32开发板介绍GD32系列开发板是由北京兆易创新技术有限公司发布的,GD32作为中国32位通用MCU领域的主流之选,以累计超过3亿颗的出货数量、超过2万的用户数量、23个系列330余款产品型号选择的广阔应用覆盖率稳居市场前列。年初该公司还发布了基于Arm® Cortex®-M23内核MCU的最新产品,GD32E232系列超值型微控制器。3 相同点(1)信号命名方式相同,而且相同信号的引脚定义基本相同。(2)函数库文件基本相同。(3)编译工具相同如keil、IAR,当然STM32也有一些自己的开发工具。(4)芯片内部寄存器和外部IP寄存器的逻辑地址相同。4 不同点(1)工作电压有所不同,STM32的工作电压在2.0~3.6V或1.65~3.6V,GD32的工作电压在 2.6~3.6V,范围相对要小一点。(2)相同主频之下,GD32的开发板速度要更快一点,大约快10%-20%左右。(3)GD32的flash擦除时间要比STM32更长一点(4)使用HSE(高速外部时钟):GD32的主频最大108M,STM32的主频最大72M;使用HSI(高速内部时钟):GD32的主频最大108M,STM32的主频最大64M。(5)GD32的ADC精度不如STM32的好,输入阻抗小:GD为9位精度,ST为11位精度,同采样速率下GD的输入阻抗比STM小。(6) 功耗方面,在相同主频时,GD的运行功耗比STM32小,但是在其他情况的相同配置下,GD32的功耗要相对高一点(7) ADC精度:GD32的ADC精度不如STM32的好,输入阻抗小:GD为9位精度,ST为11位精度,同采样速率下GD的输入阻抗比STM小。
  • [技术干货] 【LiteOS】LiteOS消息队列使用总结
    LiteOS针对队列读写提供带拷贝和不带拷贝的两种方式,这两种方式在使用上有所区别,如不注意就会入坑,故此总结一下。 消息队列,是一种常用于任务间通信的数据结构,实现了接收来自任务或中断的不固定长度的消息,并根据不同的接口选择传递消息是否存放在自己空间。队列提供一部处理机制,可以起到缓存消息的作用。 ## 队列创建 LiteOS创建队列的函数如下: ```c UINT32 LOS_QueueCreate(CHAR *pcQueueName, UINT16 usLen, UINT32 *puwQueueID, UINT32 uwFlags, UINT16 usMaxMsgSize); //usLen 队列长度(消息数量),即队列可以存多少条消息 //uwFlags 队列类型 FIFO or PRIO,暂时保留未用 //usMaxMsgSize 消息最大字节数(消息长度) ``` **注意:** LOS_QueueCreate 会根据传入的队列长度、消息长度来动态申请内存空间,用于缓存用户写入队列的数据。usMaxMsgSize 队列消息的最大长度,LiteOS实际在申请空间时,会将该值再加上4,这多出来的4字节空间用于保存消息的实际长度。 ``` UINT16 usMsgSize = usMaxMsgSize + sizeof(UINT32); ``` ## 不带拷贝读写方式 不带拷贝的读写方式,本质上是将消息的地址存入消息队列中,即4字节的指针。 **但是:不带拷贝的读写方式,不会保存消息的长度,即用户是无法传递不定长的消息的。这块应该是LiteOS的一个bug,原则上也是可以保存的,需要修改下源码** 不带拷贝的读写函数接口如下: ```c UINT32 LOS_QueueWrite(UINT32 uwQueueID, VOID *pBufferAddr, UINT32 uwBufferSize, UINT32 uwTimeOut) //pBufferAddr 要写入的数据起始地址 //uwBufferSize 写入长度,在不带拷贝模式下,该值在代码中被固定修改为4字节(指针长度) //uwTimeOut 超时时间. 0表示不阻塞,最大值为 LOS_WAIT_FOREVER UINT32 LOS_QueueRead(UINT32 uwQueueID, VOID *pBufferAddr, UINT32 uwBufferSize, UINT32 uwTimeOut) //pBufferAddr 存储获取到的数据地址(读取的数据要保存的目的位置) //uwBufferSize 缓冲区长度,大于等于创建队列时的最大消息长度,尽量传入最大值 ``` **注意: 不带拷贝的读取函数,需要传入缓存长度uwBufferSize,该值必须初始化为一个大于等于队列最大消息长度的值** ## 带拷贝的读写方式 带拷贝的读写方式,就将指定地址的消息数据全部存入消息队列中,同时队列中也会保存消息的实际长度。 带拷贝的读写函数接口如下: ```c //带拷贝的写入 UINT32 LOS_QueueWriteCopy(UINT32 uwQueueID, VOID *pBufferAddr, UINT32 uwBufferSize, UINT32 uwTimeOut); //带拷贝的读取 UINT32 LOS_QueueReadCopy(UINT32 uwQueueID, VOID *pBufferAddr, UINT32 *puwBufferSize, UINT32 uwTimeOut); // pBufferAddr 缓存地址 // puwBufferSize 通过该指针返回读取到的消息长度。 // 使用前,该变量需要初始为大于等于队列最大消息长度的值(队列创建时指定) // 该值可以理解为我们将要存储消息的缓存长度,它必须是能够放得下最大长度的消息 //读取结束后,该变量保存之际读取到的消息长度 ``` **注意: 带拷贝的读取函数,需要传入指针变量puwBufferSize,函数会通过该指针返回实际读取到的消息长度。但是该指针指向的值,在使用前必须初始化为一个大于等于队列最大消息长度的值** **按照如下方式使用队列读取函数:** ```c UINT32 rxLen = 10; //rxLen的初始必须大于队列消息最大长度 uwRet = LOS_QueueReadCopy(QueID,buffer,&rxLen,0); ```
  • [问题求助] 请问如何将LWIP移植入LiteOS系统使用
    LiteOS系统已经成功运行,网卡驱动已经编写完成(lwip可以裸机运行),请教如何让lwip运行于LiteOS内核?
  • [技术干货] LiteOS双向链表使用详解
    官方开放文档中关于双向链表的介绍比较简单,并没有告诉大家到底怎么在自己的数据结构中使用链表。其实也比较简单,时间紧的朋友可以直接看第二部分。一、双向链表简介双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向其前一个节点的指针。其头指针head是唯一确定的。从双向链表的任意一个节点开始,都可以很方便的访问它的前驱和后继节点。如下图所示:LiteOS双向链接跟linux的内核链接原理一样。LiteOS定义了双向链表基本数据结构,并提供了相关的函数和宏定义来操作链表,用户可以添加、删除节点,遍历节点等。LiteOS双向链表数据结构定义如下,包含了两个指针,分别指向前驱和后继节点。这是个最基本的数据结构,仅包含有双向链表。typedef struct LOS_DL_LIST {     struct LOS_DL_LIST *pstPrev;    /**< Current node's pointer to the previous node*/     struct LOS_DL_LIST *pstNext;    /**< Current node's pointer to the next node*/ } LOS_DL_LIST;LiteOS双向链表操作函数:VOID LOS_ListInit(LOS_DL_LIST *pstList) #define LOS_DL_LIST_FIRST(pstObject) ((pstObject)->pstNext) VOID LOS_ListAdd(LOS_DL_LIST *pstList, LOS_DL_LIST *pstNode) VOID LOS_ListTailInsert(LOS_DL_LIST *pstList, LOS_DL_LIST *pstNode) VOID LOS_ListDelete(LOS_DL_LIST *pstNode) BOOL LOS_ListEmpty(LOS_DL_LIST *pstNode) //return (BOOL)(pstNode->pstNext == pstNode); //取得链表所在结构体地址,即根据链表节点的地址获取用户结构体地址. //item: 链表节点地址.用户结构体中定义的链表成员的地址 //type: 用户结构体名称 //member:链表在用户结构体中的成员名称 #define LOS_DL_LIST_ENTRY(item, type, member) \     ((type *)((char *)item - LOS_OFF_SET_OF(type, member))) \ //遍历用户结构体 for循环 //item:用户结构体指针。需用户在外定义好。 //list: 链表首地址 //type: 用户结构体名称 //member: 链表在用户结构体中的成员名称 #define LOS_DL_LIST_FOR_EACH_ENTRY(item, list, type, member) \     for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member); \         &item->member != (list); \         item = LOS_DL_LIST_ENTRY(item->member.pstNext, type, member))    //遍历用户结构体,可删除节点  for循环 //item:用户结构体指针。需用户在外定义好。 //next: 用户结构体指针,指向item的下一个节点. 需用户在外定义该变量。 //list: 链表首地址 //type: 用户结构体名称 //member: 链表在用户结构体中的成员名称         #define LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(item, next, list, type, member)            \     for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member), \         next = LOS_DL_LIST_ENTRY(item->member.pstNext, type, member); \         &item->member != (list); \         item = next, next = LOS_DL_LIST_ENTRY(item->member.pstNext, type, member))     //遍历双向链表,不可有删除节点.仅遍历链表节点(不包括用户结构体内容) //item: 链表指针, 需用户定义好该变量 //list: 链表头 #define LOS_DL_LIST_FOR_EACH(item, list)   \     for ((item) = (list)->pstNext; \         (item) != (list); \         (item) = (item)->pstNext)         //安全遍历双向链表,可删除节点.仅遍历链表节点(不包括用户结构体内容) //item: 链表指针, 需用户定义好该变量 //next: 链表指针, 指向item下一个节点.需用户定义好该变量 //list: 链表头 #define LOS_DL_LIST_FOR_EACH_SAFE(item, next, list) \     for (item = (list)->pstNext, next = item->pstNext; item != (list); \         item = next, next = item->pstNext)    // 定义一个双向链表节点并初始化,可用于初始化一个链表头.变量名为list #define LOS_DL_LIST_HEAD(list) \             LOS_DL_LIST list = { &(list), &(list) }二、链表的使用LiteOS 内核定义的双向链表跟linux内核链表思想一致,它仅仅包含了两个指针类型的变量。用户使用双向链表时,要将双向链表加入自己的数据结构中。即定义一个结构体,成员包括用户需要用到的数据类型,最后,在结构体中加入内核双向链表数据类型,使之成为结构体的成员。如代码所示,定义用户结构体,包含双向链表成员:typedef struct {     UINT16          member1;  //用户数据              UINT16          member2;  //用户数据据                         LOS_DL_LIST     mList;    //双向链表    } User_Data_t;基本原理是:利用双向链表,将用户结构体中定义好的链表成员变量都链接起来;链表节点在用户结构体中的偏移地址是固定的,根据链表节点的地址,减去偏移地址,就能得到用户结构体变量的起始地址了。LiteOS中根据链表地址获取用户节点地址的宏定义是://取得链表所在结构体地址,即根据链表节点的地址获取用户结构体地址. //item: 链表节点地址.用户结构体中定义的链表成员的地址 //type: 用户结构体名称 //member:链表在用户结构体中的成员名称 #define LOS_DL_LIST_ENTRY(item, type, member) \     ((type *)((char *)item - LOS_OFF_SET_OF(type, member))) \如下图所示,利用链表将用户节点中的链表成员链接起来示例代码如下:User_Data_t  data1,data2,data3; //定义用户变量 LOS_DL_LIST  gHeader;   //定义链表头 data1.member1 = 1;data2.member1 = 2;data3.member1 = 3;//初始化用户数据 LOS_ListInit(&gHeader);  //初始化链表 LOS_ListTailInsert(&gHeader,&data1.mList);//将data1添加到链表尾部 LOS_ListTailInsert(&gHeader,&data2.mList);//将data2添加到链表尾部,即data1之后 LOS_ListTailInsert(&gHeader,&data3.mList);//将data3添加到链表尾部,即data2之后 //从链表中取数据  LOS_DL_LIST *node; User_Data_t  *pData; node = LOS_DL_LIST_FIRST(&gHeader); //获取链表第一个节点.node指向data1.mList //根据node取得data1的地址 pData = LOS_DL_LIST_ENTRY(node,User_Data_t,mList); printf("data1.member1 is %d!\r\n",pData->member1); //遍历链表 LOS_DL_LIST_FOR_EACH_ENTRY(pData,&gHeader,User_Data_t,mList) {     printf("data member1 is %d!\r\n",pData->member1); }
总条数:623 到第
上滑加载中