-
要用好liteOS,会编译是第一步,会看错误提示是会编译的第一步,会了调试必然事半功倍,不重视或不会效率肯定大打折扣(经验教训)下面是出错信息的截图:从最后一行往上看倒数第4行,“Makefile 534....."表示执行makefile的534行出错了。原因是代码有问题,不是makefile问题,需要继续往上看倒数第5行,”make *** [build/los_api_task.o] Error 1"表示把los_api_task.c编译成los_api_task.o的过程有错误unknown type name XXXX 对应的行表示具体的错误,最后面的一个错误“C:/........./los_task.ph:553:24" 表示错误的地方做los_task.ph文件的553行,24列,点击可以定位到具体文件的具体位置。从截图可以看到,共列了8个错误,这8个错误都是来源于los_task.ph这个文件里的不同位置。具体错误再往上看,点最后一个”from ....."行,编译器就是执行到这一行时出错的,并不是这一行有问题,而执行该行编译时,通过include引入的lost_task.h文件里面的内容的问题继续点击倒数第二个“ from ....."行,此时,定位到了对应的los_task.h文件的开始,并不是定位到该行信息上面标的”42“行 (这里可能是liteOS Studio的一个bug)手工滚动到42行,也是一个include语句,对应los_base.h正好也是对应上一行”from ..... "对应的文件,以及对应的行,不断往前找,最问题定位在main.h的第50行(看下图,注意是下图,不是上面的图),而这一行所include的文件,正好是第1个错误对应的文件los_task.ph此时,问题在那里,以及错误提示的关系,就很清楚了。由于第一次使用,而且有些提示链接没有定位到具体的行,导致我没有第一时间看清楚这些关系,花了好多时间去查找这个错误。
-
在用LiteOS Studio编译和烧录文件时,大家是否清楚,代码是怎么构建起来的,最终烧录到开发版的文件是哪个,怎么生成的?在导入工程后,都是需要设置我们工程的Makefile,LiteOS Studio才能正常编译我们的代码,有没有朋友认真地看过这个文件?前方高能!!接下来我们对这个文件来进行肢解!!!!我们以小熊开发部提供的样例(E53_IA1)来进行分析:Makefile 所在目录:E53_IA1\targets\STM32L431_BearPi\GCC\Makefile简单的普及下Makefile几个怪怪的符号,大佬请忽略:格式:[目标文件 产品] : [依赖文件,原材料] 对原材料的处理样例:XXX : aaa bbb ccc $(CC) $^ -o $@ $(CC) $< -o $@$@--目标文件->XXX $^--所有的依赖文件->aaa bbb ccc$<--第一个依赖文件->aaa还有一个%.c 代表所有以.c结尾的文件makefile里的函数:return = $(functionname arg1,arg2,arg3...)。这里用到的函数有:$(addprefix 前缀,加前缀对象) 加前缀函数。$(notdir $(C_SOURCES:.c=.o)) 去除所有的目录信息,文件名列表将只有文件名$(sort $(dir $(C_SOURCES))) 排序函数 并去重$(dir $(C_SOURCES)) 取目录函数$(wildcard $(BUILD_DIR)/*.d) 扩展通配符 列举所有.d文件继续!!!!//包含配置选项文件include config.mkinclude prune.mk//定义我们生成目标文件名,最终我们会生成.elf .bin .hex这三个家伙,用于烧录和调试TARGET = Huawei_LiteOS定义编译工具链:PREFIX = arm-none-eabi-//编译链前缀CC = $(PREFIX)gcc //编译工具AS = $(PREFIX)gcc -x assembler-with-cpp //汇编工具OBJCOPY = $(PREFIX)objcopy //拷贝工具 可以进行格式转换OBJDUMP = $(PREFIX)objdump //反汇编工具AR = $(PREFIX)ar //打包工具 生成静态库SZ = $(PREFIX)size //列出程序文件中各段的大小LD = $(PREFIX)ld //链接工具HEX = $(OBJCOPY) -O ihex //生成十六进制文件BIN = $(OBJCOPY) -O binary -S //生成二进制镜像文件 用户烧录//定义编译文件生成目录BUILD_DIR = build添加原材料:添加汇编源码ASM_SOURCES_s = \ ${wildcard $(PROJECTBASE)/los_startup_gcc.s}添加C语音源码 .......C_SOURCES += $(HAL_DRIVER_SRC).......添加宏定义 .......C_DEFS += -DMBEDTLS_DEBUG_C .......添加C语音头文件 .......C_INCLUDES += $(OTA_INC) .......添加汇编头文件AS_INCLUDES = 生成汇编混编文件(.lst):$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) //在生成.o的文件的同时,将“-a,-ad,-alms=XX”选项传递给汇编程序,生成.lst文件,这些文件在单步调试,汇编代码窗口,显示的就是该文件。$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@左边为main.lst 右边为单步调试时,汇编窗口。生成依赖关系信息文件(.d): (这是我们看到build目录下有很多.d文件的原因)CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" //包含所有.d文件。-include 当文件不存在是不报错退出。没带“-”则会报错退出-include $(wildcard $(BUILD_DIR)/*.d)材料准备好了,开始生产拉设置编译选项CFLAGS设置引用的库LIBS设置链接选项LDFLAGS开始生产者三个家伙啦!all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin文件生成路径:.c ---> .o ---> .elf --->.bin .hex ^ |.s ---> .o---------//编译所有.c文件$(BUILD_DIR)/%.o: %.c Makefile config.mk prune.mk | $(BUILD_DIR)$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@//编译所有.s汇编文件$(BUILD_DIR)/%.o: %.s Makefile config.mk prune.mk | $(BUILD_DIR)$(AS) -c $(CFLAGS) $< -o $@//生成ellf文件$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile config.mk prune.mk$(CC) $(OBJECTS) $(LDFLAGS) -o $@$(SZ) $@//生成十六进制文件$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)$(HEX) $< $@//生成二进制文件$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)$(BIN) $< $@后续将以此作为学习笔记,从不同的角度来学习liteos及iot相关的知识:下一个笔记:利用对比工具,看看开发版提供的例程和liteos源码的区别,浅谈liteos的移植。
-
根据课程下载安装了liteos studio,并导入小熊板的liteos工程,简单配置一下工程信息,可以顺利编译。为了好好研究一下,下载了内核编程手册,查看工程文件,原来demos目录下,有内核编程手册上提到所有代码通过修改targets/GCC目录下的Makefile,把demos下的los_api_task.c加到编译清单中问题来了,编译不通过以为是缺少头文件包含(包含在.c文件进行include和编译时能找到),后来高手提示检测头包含的循环引用问题,把某个include注解掉了,问题解决。我也以为这样完事了,但总觉得不对,问题是缺少定义,并不是循环定义,只好继续研究。查了半天,最后终于搞明白了,是因为嵌套引用的先后顺序+#ifndef预编译,导致某些定义没有引入进来。其实,编译的出错信息提示的非常完整,如果早点好好看也不至于浪费大多时间。现在详细分析一下:1、没有定义的内容在los_task.ph文件里,正确的定义位置在los_task.h里面,而且这个los_tash.h的引用是通过条件编译引入的2、再来看los_tash.h的内容,也是用预编译条件括起来的,如果这个条件是不成立的话,那就真的是缺少定义导致编译不成功。(但是有这个可能吗?毕竟如果不有define过,那个肯定有被引用的)3、一步一步跟踪,发现确实是这样。从los_api_task.c的37行,其实是”#include "los_task.h"一直往回找,能找到main.h的50行“#include "los_task.ph"”,因为los_task.h在los_api_task.c里引用过,所以los_task.ph再次引用los_task.h时,根据条件预编规则,此时los_task.h不再引用。另外,因为引用过程一步一步嵌套,引入los_task.h时,TSK_ENTRY_FUNC还没有真正定义,就进入“los_base.h"引入了(看上图),当最后引入los_task.ph里,其实TSK_ENTRY_FUNC还是没有定义,但los_task.ph已要求使用TSK_ENTRY_FUNC,这就是直正的问题所在。
-
【1. 问题现象说明】 从github拉取了最新的代码下来(develop分支),移植LiteOS到 STM32F103C8T6,内存20K。 targetconfig.h文件中保持默认配置,只修改了内存大小和头文件,裸机程序占用RAM约8K。 主程序中分别初始化硬件、内核,创建了一个任务,循环点亮LED,程序编译OK,下载后不运行。 主程序如下 【2. 原因】 调试发现,内核初始化正常运行,程序卡在了用户创建任务函数(AppTaskCreate),系统函数 LOS_TaskCreate 一直不退出。 经过对比源码发现,新代码将软件定时器任务堆栈改到了4K,之前的代码中是可以通过外部宏定义修改大小的,如下图 在源码中把这个定时器的堆栈改为1K之后,程序可以正常运行了。【3 疑问点】 1、为什么要将软件定时器改为固定堆栈4K,外部配置不挺好么? 2、从原因分析看,是因为定时器占用堆栈过多,导致用户任务无法创建。 那么由于内存不足无法创建任务,为什么系统函数 LOS_TaskCreate 会卡住不退出呢? 至少应该返回错误,通过错误码通知用户内存不足吧。
-
TSK_ENTRY_FUNC的定义在这里,kernel\base\include\los_task.phmain.c有使用TSK_ENTRY_FUNC,编译可以通过。demos/kernel/api/los_api_task.c使用了TSK_ENTRY_FUNC,也有include los_task.h ,但编译通不过有人能指导一下吗?
-
如今,即便是不懂技术的人都知道IoT具有非常可观的前景,而物联网产业的发展并非一帆风顺,其中制约行业发展的一大关键技术就是通讯技术,一因为物联网要实现的就是物体间的信息交换和通信,没有通讯技术,物联网就是空谈。在物联网产业的发展过程中,逐渐形成了NB-IoT、eMTC、LoRa三大通讯技术的三足鼎立,每种技术各有千秋,在各自的应用场景上有独特的优势。IoT是碎片化的,这就要求协议间的兼容与互通,虽然三种技术想互存在竞争,但是未来NB-IoT、eMTC、LoRa也是需要想互融合的,因为最好的技术一定是包容的。一、NB-IoT这是一个新兴的技术,中文叫窄带物联网,从名字上就知道非常适合物联网场景。在带宽和成本上的优势明显,NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,可直接部署UMTS网络、LTE网络和GSM网络,很容易实现网络的升级。同时,相对于4G网络,它支持的待机时间长,连接高效,而且联网设备的电池寿命很高。NB-IoT的优势应用场景正是因为NB-IoT技术成本低、功耗低,所以在定位、水表和停车等领域应用很广泛,如共享单车里就有内置NB-IoT模组,实现物联网通讯。智能零售,智能家居,智能安防和智慧城市等都是其未来潜在的应用场景。NB-IoT虽然很好,但在国内的发展现状是缺乏一个统一的开放产业平台,同时标准、芯片、网络和相关的应用层厂商以中小企业为主,还需要壮大自身联盟的实力,打造强大的生态。二、eMTC虽然NB-IoT能满足物联网很多的应用场景,但是在可靠低时延等场景里面,eMTC才是最优解。eMTC是由LTE协议演进而来的,也就是中国移动的通讯协议。移动为了降低成本,对LTE协议进行优化,让用户设备支持1.4MHz的射频和基带带宽,直接接入LTE网络,因为从持久发展上,物联网成本是必须考虑的事情。eMTC更适合这些场景正是由于频率低和协议简单,eMTC芯片的成本可能比NB-IoT芯片的成本更低,eMTC的移动性更好,这就让它在动态物联网场景中优势是好于NB-IoT的。eMTC在智能物流的应用很广泛,京东的无人送货车上就有eMTC芯片。现在很多的智能穿戴产品上有检测和定位功能,也有eMTC技术的身影。未来,可能在智能公交、智能电梯等场景也能看到eMTC技术。eMTC与NB-IoT技术实现物联网是完全不同的两种思路,eMTC终端工作带宽高于NB-IoT终端五倍以上,eMTC技术能够提供性价比很高的终端通讯解决方案,这比B-IoT技术在成本上的优势还要好。三、LPWAN(LoRa)熟悉LPWAN通信技术的都知道,LPWAN通信是一种低功率广域网络,是一种可以用低比特率进行长距离通讯的无线网络技术。对于很多低电量需求、低比特率等场景,物联网LPWAN技术就是非常不错的选择。LPWAN技术是可以用来建立一个私有无线感测网络,可以利用第三方提供的服务和基础设施,这使得可以直接使用公共的感测器,节省了很多硬件成本,对网络部署方而言很有诱惑力。目前最火的LPWAN技术就是LoRa,LoRa有个中文名叫做远距离无线电,它的一大特点是在同样功耗下比其它无线方式传播的距离更远,实现了低功耗和远距离的统一,是一种前景广阔的通讯技术。LoRa网络主要由四部分组成,它们是基站(也可以是网关)、服务器、LoRa终端和物联网云。LoRa的特点是应用端和服务器端数据双向传递。LoRa的优势是超低功耗和多信道数据传输,系统数据容量增加了,网关和终端系统能支持测距和定位,对于位置敏感的应用简直就是量身定做。据悉,阿里曾表示,要在未来5年内连接100亿台设备。LoRa在物流、健康医疗、智能环境、运输等领域的优势很明显,这些恰恰是阿里巴巴布局的领域,也难怪要重金布局。物联网已经不只是一种想象的场景,它已经成为我们生活的一部分,人们通过定位技术监控,通过通讯技术联网,通过物联网减少交通事故等,这些都离不开物联网通讯技术的支持,NB-IoT、eMTC、LoRa技术各有千秋,随着物联网产业的发展,三者必将发挥更大的作用。G-washington 发表于2019-09-03 20:54:16 2019-09-03 20:54:16 最后回复 G-washington 2019-09-03 20:54:165300 0
-
我要把一个firmware加载到内存,但LiteOS没有文件系统,要怎么做呢?
-
近期企业网消防项目中一个外设需要125us处理一次数据,需要高精度的计时器看msdk los_config.h文件中有关于时间精度的配置,#define LOSCFG_BASE_CORE_TICK_PER_SECOND 100请问这个配置需要msdk重新构建吗? liteo是否也需要重新构建这个值最高能配置到多少?
-
前几天兆易创新举办了一场名为“智领全球 芯动全球”的基于RISC-V内核的32位MCU震撼首发的发布会:https://ee.ofweek.com/2019-08/ART-8110-2805-30404001.htmlhttp://www.eepw.com.cn/article/201908/404022.htmLiteOS SDK和IoT Studio也在第一时间支持了:LiteOS SDK支持了这款RISC-V架构的MCU,IoT Studio支持了该款MCU的开发编译、调测和烧录:LiteOS SDK最新的分支代码:https://github.com/LiteOS/LiteOS_Lab/tree/iot_linkIoT Studio的最新下载链接:https://developer.obs.cn-north-4.myhuaweicloud.com/idea/IoT-Studio.zip欢迎大家下载体验商用的RISC-V MCU和LiteOS!!!因芯片资料暂时还未开放,下次再和大家一起探讨下基于RISC-V架构的LiteOS移植和开发。有兴趣的可以通过RISC-V官网https://riscv.org/specifications/下载spec进行了解。
-
项目移植liteos后,hal_delay()用后导致程序跑飞?怎么解决?没有移植liteos前部分操作使用hal_delay,正常运行,移植后,就不正常了? 咋解决呢?
-
Demo、教程可以下载附件方法1:开发板以太网口经过网线使用笔记本wifi作为网关上网一:笔记本使用wifi连接热点上网二:在网络连接界面中,将以太网设置为自动获取ip地址。三:在笔记本的网络连接管理界面,右键点击WLAN,选择属性 进入WLAN属性页面后,选择共享,然后勾选上页面中的 "允许其他网络用户通过此计算机的 Internet来拿节来连接(N)" 并且在家庭网络连接的下拉框中选择 "以太网"。四:步骤二完成后,查看以太网的IPV4属性。 在其中IPV4的属性会变成 使用下面的ip地址 例如:ip 192.168.137.1 netmask 255.255.255.0 说明: 获取得到的ip根据笔记本的不同可能有所不同,请根据实际情况使用。五:在LiteOS的工程中,找到Src\net_driver.c修改IP_ADDRESS[0] IP_ADDRESS[1] IP_ADDRESS[2] IP_ADDRESS[3] 这4个宏的值,其值修改为跟笔记本的以太网ip同一个ip段的地址即可, 比如修改为 192 168 137 2同步修改 NETMASK_ADDRESS[0] [1] [2] [3] 修改 GATEWAY_ADDRESS[0] GATEWAY_ADDRESS[1] GATEWAY_ADDRESS[2] GATEWAY_ADDRESS[3] 的值为笔记本的以太网的ip地址 即我们步骤四中得到的ip 192 168 137 1六:以上步骤完成后,重新编译LiteOS工程,然后使用sw4stm32直接烧录运行。 如果连接云平台成功,则串口调试助手会输出LOG信息,华为云IOT平台也会接收到数据。
-
教程,demo请下载附件【华为云OC平台的mqtt接入IP及端口号】 【华为云设备注册成功的设备ID和密钥】 【修改LiteOS代码的IP、port、device_ID、password,对应上面的4个】
-
本来抱着学习源码的态度,看了几天的AT框架的代码,现在实在是泪奔了,现在给大家总结一下吧:1、如果仅仅是使用LiteOS 的SDK快速接入平台,不建议去看AT的源码,模仿demo凭经验修改下驱动就好了2、AT框架现在仅有简单的介绍,没有详细资料,看起来很费事3、目前的AT框架,使用到了LiteOS ,并不算是一个独立的组件,很难剥离出来使用4、申请了大量内存使用,开销还是比较大的,demo中的源码来看,都已经申请了15k以上了,实难理解5、代码中几乎没有注释,大部分凭经验还是可以看懂,但有些接口,就真的很难看懂了,关键是,真的没有comment呀 (此处省略一万字,当真无语呀,怎么可以没有注释呢?你以为你定义的变量和接口很好猜么,来给我解释下at_oob是个啥,step_callback又是个什么鬼,我只知道这大概是个回调吧,啊啊啊)吐槽完了,还是来点干的吧:at_api.c at_api.h : 向上提供接口,主要供端云互通组件调用,实现数据发送和接收。 用户需要在外部文件实现 at_adaptor_api 接口。at_main.c at_main.h : at 命令发送和响应处理。此处算是核心了,看起来费劲。 串口的接收是环形buffer,利用串口的空闲中断实现分帧机制;每次串口中断都把数据写入环形buffer,移动写指针;如下图: 串口空闲中断,用一个结构体(recv_buff)记录本次接收到的数据长度,以及数据在buffer中的索引,发送到消息队列; 创建了一个任务,循环读取消息队列并处理at_hal.c 实现串口的初始化。能力确实有限,很多看不懂,还望大侠们多发帖子,教教我们呐
-
是使用mount命令吗?U盘的设备号是啥?有大佬能指点一下吗?
-
请教:Liteos 软件定时器的回调函数中,为何不能 使用 HAL_Delay( )?如果操作之间需要延时 咋弄?
上滑加载中
推荐直播
-
TinyEngine低代码引擎系列第2讲——向下扎根,向上生长,TinyEngine灵活构建个性化低代码平台
2024/11/14 周四 16:00-18:00
王老师 华为云前端开发工程师,TinyEngine开源负责人
王老师将从TinyEngine 的灵活定制能力出发,带大家了解隐藏在低代码背后的潜在挑战及突破思路,通过实践及运用,帮助大家贴近面向未来低代码产品。
回顾中 -
华为云AI入门课:AI发展趋势与华为愿景
2024/11/18 周一 18:20-20:20
Alex 华为云学堂技术讲师
本期直播旨在帮助开发者熟悉理解AI技术概念,AI发展趋势,AI实用化前景,了解熟悉未来主要技术栈,当前发展瓶颈等行业化知识。帮助开发者在AI领域快速构建知识体系,构建职业竞争力。
去报名 -
华为云软件开发生产线(CodeArts)10月新特性解读
2024/11/19 周二 19:00-20:00
苏柏亚培 华为云高级产品经理
不知道产品的最新特性?没法和产品团队建立直接的沟通?本期直播产品经理将为您解读华为云软件开发生产线10月发布的新特性,并在直播过程中为您答疑解惑。
去报名
热门标签