• [技术干货] LiteOS移植STM32之串口超时卡死的问题
    前段时间尝试移植了LiteOS到STM32F103上,遇到一个很奇怪的问题,当使用串口写函数HAL_UART_Receive时,如果串口断开,那么系统会死在这里追了半天发现问题出在了tickstart = HAL_GetTick();这个函数的返回结果上,然后就想到stm32的systick我们已经禁止了。把HAL_GetTick这个函数用LOS_TickCountGet()重写了一下结果就好了。不知道还有没有别的类似问题存在...
  • [技术干货] 0x06 LiteOS内核详解--中断接管机制(上)
            摘要:中断管理一般有两种方式,第一种就是STM32 Hal库提供的回调函数,当发生中断时,跳转到对应中断向量处,执行之前存放好的中断处理函数。第二种就是LiteOS提供的中断接管管理的方式,将所有的中断统一管理,除了几个重要的中断外,其余中断都用osInterrupt函数在其中断向量处占位,最终无论发生什么中断首先进入到osInterrupt函数中判断,根据中断是否使能、优先级等等信息来调用相应函数进行处理。一、STM32Hal库处理中断的方式        在STM32CubeMX生成的工程文件中,都含有一个STM32xxxx_startup.S汇编文件,一般我们都叫它“启动文件”,里面通过DCD分配了一片连续的空间,实现了中断向量表,在每个中断处理函数上用weak来修饰,意思就是我们可以在其他文件,例如.c文件中重写这个处理函数。        当发生特定中断时,例如外部中断15_10 (EXTI15_10_IRQHandler)时,就会跳转到stm32xxx_it.c文件中的void EXTI15_10_IRQHandler (void)函数中处理,在该函数中又调用了Hal库中的stm32xxx_hal_gpio.c文件中的void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)函数。①    查询中断触发的中断的中断线是否和我们要处理的中断的中断线是一致的。②    清除中断③    调用我们实现的中断处理函数二、使能中断接管机制        我们在生成好了LiteOS工程文件后,可以进到工程目录下的OS_CONFIG目录中的target_config.h文件中配置LOSCFG_PLATFORM_HWI宏和LOSCFG_PLATFORM_HWI_LIMIT宏。        LOSCFG_PLATFORM_HWI宏配置为YES,代表使能硬件中断接管机制。(这个宏在los_hwi.c文件中被使用)        LOSCFG_PLATFORM_LIMIT宏配置最大支持的硬件中断数。(这个宏可能暂时没有什么作用)最大支持的中断数应该取决于los_hwi.h文件中的OS_HWI_MAX_NUM宏。三、中断接管机制涉及到的文件1.   几条中断相关的汇编指令        CPSIE I     开启所有中断        CPSID I    关闭所有可以关闭的中断 2.   los_hwi.h和los_hwi.c文件        它们分别位于iot_link\os\liteos\arch\arm\arm-m\src和iot_link\os\liteos\arch\arm\arm-m\include目录中。①    如果我们不使用“接管中断”的方式,这意味着SysTick_Handler函数还是使用原来Hal库方式提供的,我们如果需要获取系统时钟,只能采用los_tick.ph和los_tick.c中提供的LOS_SysClockGet函数来获取。根据内核的型号进行默认最大中断数的配置,看到这里,所以我推断出上面的LOSCFG_PLATFORM_LIMIT宏暂时没有使用。       配置中断默认支持的优先级,最高优先级为0最低为7。配置当发生时中断时,调用中断处理函数默认不传递参数。根据上面配置的中断处理函数被调用时,是否传参,来设置中断处理函数的函数指针类型。该函数用于创建中断,最终被注册进OSAL层,当我们调用int osal_int_connect(int intnum, int prio, int mode, fn_interrupt_handle callback, void *arg);函数时,实际上就是调用本函数。参数:uwHwiNum:硬件中断号,可以在stm32xxx.h文件中查看或者直接使用,假设我们要创建看门狗中断,就是填入 WWDG_IRQn即可。usHwiPrio:中断优先级,按照默认配置为0-7,数字越小代表该中断的优先级越高。usMode:暂时没有使用,填入0即可。pfnHandler:中断处理函数指针,我们需要按照上面说说的中断处理函数指针的类型的定义处理函数指针,并把指针值填到这里。uwArg:我们如果没有使能OS_HWI_WITH_ARG为YES,则该项可以填写NULL。返回值:我们在调用创建中断函数之后应该去接收返回值判断是否创建成功,并且可以根据返回值来判断是何种错误导致的创建失败。       OS_ERRNO_HWI_PROC_FUNC_NULL:未传入中断处理函数指针。       OS_ERRNO_HWI_NUM_INVALID:中断号无效。       OS_ERRNO_HWI_NO_MEMORY:内存不足导致无法创建。       OS_ERRNO_HWI_ALREADY_CREATED:该中断号已经被创建过了       LOS_OK:中断被成功创建。       该函数和创建中断函数相反,用于删除创建好的中断。参数:       uwHwiNum:中断号返回值:       OS_ERRNO_HWI_NUM_INVALID:我们删除了没有创建过中断的中断号,就会产生该错误。       LOS_OK:删除成功。当发生中断时,可以用该函数获取中断号,从而判断是何种中断。因为除了前面的内核相关中断外,其他中断的向量表处都被放置了osInterrupt()函数,所以在osInterrupt()函数内,我们需要调用osIntNumGet()来获取当前的中断号,从而能调用对应中断处理函数来处理。开启和关闭所有可屏蔽中断,主要用于临界区访问或者进行一些重要的配置,防止被突发的中断打断,本质上就是修改PRIMASK寄存器中的值,来发到屏蔽中断的目的。恢复PRIMASK寄存器中的值。总结:上述三个函数LOS_IntLock()、LOS_IntUnLock()、LOS_IntRestore()一般的使用方法是在配置好了所有系统相关信息和中断后,调用LOS_IntUnLock()开启中断;在进入临界区处理时,调用uvIntSave = LOS_IntLock();在关闭中断之前将PRIMASK寄存器中的值读到uvIntSave变量中保存,退出临界区时,使用LOS_IntRestore(uvIntSave);恢复。
  • [问题求助] 在做LiteOS的Hello World下载后Hello World! This is LiteOS!没有输出什么问题?
  • [技术干货] 0x05 LiteOS内核详解--如何知道LiteOS中调用了哪些文件?
    摘要:如何知道LiteOS中使用了哪些文件?当然是看Makefile文件咯,因为在LiteOS工程中使用Makefile来控制编译的,我们只要阅读其Makefile即可知道哪些文件参与了编译,有关Makefile的学习,请参考我的帖子“分享几个彻底学习LiteOS_Lab需要具备的知识”。本贴以armv7-m内核为例,带领大家阅读OS组件中LiteOS的Makefile。一、LiteOS_Lab中Makefile之间的关系首先我们可以看到在LiteOS_Lab/targets/xxxxx(替换为开发板名称)/GCC目录下有一个Makefile,这个Makefile就是主Makefile,当我们在GCC目录下执行make指令时,就会执行all作为目标的这条指令,依次执行依赖文件需要的命令,并将include引用的makefile文件内容添加进来(说添加进来可能不准确,这是为了让大家好理解)。这里的.config就是之前通过Kconfig图形化配置界面生成的配置信息,Makefile会根据.config中的信息来选择性的包含某些组件的Makefile。这里举两个例子:例1:在.config中使能AT组件我在Kconfig配置界面中使能了AT组件,在.config文件中就会生成这么几条语句:AT组件中的Makefile文件就会判断,因为CONFIG_AT_ENABLE被配置为了y,就将AT组件中的源文件添加进来编译,并将AT组件目录作为检索头文件的目录,并定义一个宏定义CONFIG_AT_ENABLE=1,如下图。例2:在.config中使能OS组件并选择LiteOS作为OS我在Kconfig配置界面中使能了AT组件,在.config文件中就会生成这么一条语句:在OS组件中的Makefile就会进行如下判断,因为CONFIG_LITEOS_ENABLE被设置为了y,就将os/liteos/liteos_imp.mk文件引用进来编译。现在我们想知道LiteOS中调用了哪些文件直接看liteos_imp.mk文件即可。二、根据liteos_imp.mk文件分析LiteOS中使用了哪些文件liteos_imp.mk文件位于LiteOS_Lab-iot_link\iot_link\os\liteos目录下,大家可以边看我的帖子边看这个文件,这样有助于学习。以下我将这个Makefile分为几个部分来向大家讲解:1、armv7-m内核相关部分从这里可以看出,目前LiteOS支持三类内核的单片机,由上到下“armv7-m”、“armv6-m”和“riscv32”上面包含的这些文件都是与内核密切相关的文件,例如“起始文件”、“中断向量表”、“任务调度相关文件”,我们着重看一下armv7-m内核的文件liteos/arch/arm/arm-m/armv7-m/*.c:添加liteos/arch/arm/arm-m/armv7-m/目录中的全部.c文件编译(los_exc.c文件该文件用于处理异常相关)liteos/arch/arm/arm-m/armv7-m/gcc/*.c:添加了los_dispatch.c文件进行编译,该文件主要用于通过汇编语言快速完成一些系统相关操作,例如系统启动、任务调度等。liteos/arch/arm/arm-m/armv7-m/gcc/los_startup.S:添加了启动代码,这个代码使用汇编写的主要处理复位中断,设置栈顶指针,清除bss段等初始化操作。arch_inc = -I $(iot_link_root)/os/liteos/arch/arm/arm-m/armv7-m :表示以后寻找头文件可以到该目录下寻找2、armv7-m和armv6-m内核公共代码部分ifeq ($(CONFIG_ARCH_CPU_TYPE), $(filter $(CONFIG_ARCH_CPU_TYPE), "armv7-m" "armv6-m")):这句话的意思是CONFIG_ARCH_CPU_TYPE等于armv7-m或者armv6-m,那就将下面的文件和目录添加到编译列表中和头文件包含目录列表中。3、所有架构内核的公共代码部分这一部分就是所有架构的内核都能使用的的源码和寻找头文件的目录,根据目录意思,大概能得知,这一部分包含了内存管理、进程间通讯等模块。 其余Makfile文件大家可以以此类推,自行阅读,后面的内核部分就以该Makefile为索引来解读。
  • [技术干货] 期待这样的开发生态
    其实,最早被这个学习项目吸引进来是一个很巧合的事情,因为前段时间刚完成了一个类似的物联网项目,系统架构和做软件部分要使用单独的系统,想到这方面以后的系统性和可扩展性其实是有问题的,都要自己的人开发,于是关注到了华为的LiteOS这个项目,居然是免费的推广和培训,于是就义无反顾地投入时间进来参与。   市场上已经有很多诸如Arduino和树莓派等各种派的开发板,这次看到小熊派的开发板结合了华为LiteOS这个生态在配合,也是一件很有意义的事情。其实也很想看到除了小熊派,还有更多的厂家来参与,或者是不是华为提供类似软件开发LiteOS的开发方式的模式,将能兼容LiteOS系统的硬件开发,也搞一种模块化开发的设计路线,只要入门级别的硬件工程师拿到模板化的设计原理图和 Layout,就能自己生成自己要的实际可用的硬件板子,然后配合烧录的固件。   然后,再将云端开发的应用类增加一些培训,在来一个云端开发APP的运作模式,用户还能自己简易开发APP和小程序,那样这个生态系统就完整起来了。  很期待这样的状况出现!
  • [技术干货] 0x04 LiteOS内核详解--一个elf文件中有什么?
    本章将带领大家从一个Huawei_LiteOS.ELF文件里面有什么开始分析,为后面的内核分析做铺垫,特别是“中断接管”以及“启动流程“和本章有这紧密的联系。 一、ELF文件和BIN文件有什么区别?先来看看同一个程序生成的ELF文件和BIN文件的大小:不看不知道,一看吓一跳,同一个程序的ELF文件居然比BIN文件大10倍!如果你拥有一个ELF文件可以通过objcpy指令生成BIN文件,但是BIN文件不能生成ELF文件,它俩的关系是ELF文件包含BIN文件,也就是说BIN文件中有的东西ELF文件中也有,现在我们先讨论一下ELF文件中有的东西但是BIN文件中没有的东西。“DEBUG”功能和“打断点”调式的功能相信大家都用过,可以一边看汇编代码、C代码,或者打上一个断电,让程序运行到断电处停止,这就是ELF文件的功能。ELF文件中包含加载地址、运行地址、重定位表、符号表、汇编语句、注释等等信息。BIN文件中只有机器码,STM32一次读取4字节执行。上图是我通过Hex Editor软件打开的BIN文件,第一帧数据0x0000_0000(16进制表示),代表栈顶地址设置为 0x0000_0000(16进制表示),对应我在stm32启动流程文章中说的“STM32上电后硬件会从0x0000_0000(0地址处会被映射到0x8000_0000,也就是Flash中)”地址处取处四字节数据,将这四字节数据设置为栈顶,大家可能想我问是不是搞错了?为什么是0x0000_0000,没错的,后面会重新设置的,不用担心。第二帧数据是0x0800_0441,这里的地址为0x0000_0004是复位中断向量,CPU会将这个数据读入PC寄存器,跳转到0x0800_0440地方执行复位中断处理函数,相信细心的同学注意到这里的最低位是1,但是我说的是跳转到0x0800_0440地方,这里涉及到ARM指令切换Thumb指令,所以PC的最低位需要写入1,大家只要记住这个数据减1就是需要跳转到的地址。第三帧数据是0x0800_8f01,这里的地址为0x0000_0008是NMI中断向量,CPU会将0x0800_8f01读入PC,跳转到0x0800_8f00的地方执行NMI中断处理函数。 我们就分析到这里吧,以上分析只想向大家说明一个问题,BIN文件中的每一条数据和FLASH中的数据一模一样,位置也是一一对应,最前面的就是中断向量表,LiteOS中通过设置一个数组,将这个数据链接到.isr_vector段中,也就是BIN文件最前面的那几条,到底有几条取决于LiteOS中配置了多少个中断。二、反汇编Huawei_LiteOS.ELF文件如果我们通过文本编辑器打开Huawei_LiteOS.ELF文件,将会看到全是数字,无法分析。这时需要用到objdump命令,将ELF文件反汇编为汇编文件便于分析。以下是我截取的部分具有代表性的段:  这些段构成一个STM32程序的基本单元.isr_vector      存放中断向量表,LiteOS用一个数组来替代并通过链接脚本,将这个数组链接到中断向量段,发生中断时,就会跳到这个段中的某个地址处,将这个地址处的值读到PC中,去执行相应的中断处理函数,这里是重点,后面讲硬件接管中断的时候就要来说了。.text        代码段,所有函数也就是代码都会被链接到.text段中存储,被链接到.text段中的数据在程序运行中一般是不会被修改的,也不可以被修改。 .bss        我们定义的初始值为0或者无初始值的全局变量和静态局部变量会被链接到这个段中保存,这样就不用为这个数据分配存储空间了,只要告诉单片机从xxx地址开始到xxx地址结束的数据为bss段,在复位中断中,通过汇编代码将这块数据清0即可,大大减小了BIN文件的大小。 .comment 注释段,这个段中存放一些注释信息,生成链接文件时,这个段中的信息不会被保存下来。显示编译器的一些信息,所以没必要放到BIN文件中。.data 数据段,有初值并且初值不为0的全局变量和静态局部变量放到这个段中。.rodata 只读数据段,被const修饰的数据会被放到这个段中。 本篇文章点到为止,不过多的深入讲解,因为只是为了后面做LiteOS中断接管机制的一个铺垫,如果大家有兴趣了解更多相关知识,可以留言或者私信我你想听的内容,感谢!
  • [问题求助] 请教有关LiteOS实时性的问题!
         本人在STM32上移植了LiteOS,系统可以正常跑起来(说明移植应该没有问题),然后准备采用中断接收的方式,用AT指令配置NB模组,裸机是没有问题的(这一部分程序应该也没有问题),现在想放在LiteOS上跑。采用信号量进行任务与中断同步,但是中断中接收不到AT指令的反馈信息。同样的思路在Ucos上可以正常工作。      有关LiteOS刚接触到,请问哪位前辈、同伴帮忙解答一下?(个人觉得是不是所谓liteOS“软实时”的问题)
  • [技术干货] 分享几个彻底学习LiteOS_Lab需要具备的知识
    如果你想彻底搞清楚LiteOS_Lab,我以下分享的知识你都应该去了解一下,不需要彻底掌握,但是至少要会看懂、能修改。一、GNU Make (Makefile)    这是在LiteOS_Lab中用于控制编译文件的工具,比如你在一个工程中添加了某些文件或者删除了某些文件,你需要修改相应的Makefile来达到控制编译的目的,你还可以在Makefile中添加一些特定的选项,比如-O来调节优化等级、-Werror让所有的警告变成错误,使你的代码更加严谨。相关资料链接:    跟我一起写Makefile 作者:陈皓(没错,他就是“左耳朵耗子”):https://blog.csdn.net/haoel/article/details/2886    官方文档(写得特别详细,但是好多是不常用的,没必要看完,当作“字典”来使用即可):https://www.gnu.org/software/make/manual/make.html二、GNU LD    中文俗称:链接脚本,就是工程中那个os.ld文件,我们更换了RAM、Flash大小不同的芯片,就会去修改这个os.ld文件,从而达到让代码段、数据段、堆栈等等信息适配更换后的芯片。相关资料链接:    官方文档(写得特别详细,但是好多是不常用的,没必要看完,当作“字典”来使用即可):http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html三、Kconfig    我们在SDK配置一栏中看到的“通过GUI配置LiteOS_Lab组件等信息”是通过调用Kconfig来实现的。相关资料链接:    官方github仓库(可以看里面的Readme):https://github.com/ulfalizer/Kconfiglib    LiteOS_Lab研发工程师写的一个有关kconfig使用的文档:https://github.com/LiteOS/LiteOS_Lab/blob/iot_link/tools/kconfig/Readme.md
  • [基础介绍] 【第三天】LiteOS移植---传感器打卡
  • [最新动态] 【Huawei LiteOS设备开发实战营】获奖公告帖
    说明:1. 标黄部分为顺延楼层,即原定楼层不符合获奖2. 请获奖同学于6.7前邮箱(oceanconnect@huawei.com)联系小助手,提供以下信息    a) 第X次打卡获奖    b)  获奖楼层及获奖昵称    c) 获奖昵称截图,如下:    d) 收货信息:收件人,地址,电话3. 如果不记得自己的昵称了,可以回复本帖试试看看第七天打卡抽奖公示:获奖楼层获奖名单奖品140威尔HCIA考券61JackYu156微尘·90空空8LearningPawn5130zherhui67DreamerCJ53SCCSQ开发板83Alex0099107联、、、32qinglongdao116无她亦果194axushilong129JacobFang57樊心昊148luoboluobolu47zyknet12vincent_hell28jim_real78秃头9华束隐2贵港梁朝伟135K_SORA79做个技术大佬158柚别丶有歌10小菜鸟菜又菜25h12300第三天打卡抽奖公示:获奖楼层获奖昵称奖品17胡琦《万物互联:物联网核心技术与安全》20Amazing_IF26秃头30frankyu112036LIAI41yurisss63杨蛟98Casperflip101裴志松114wesong122cx2vj128Ain129潮小子133iBlueLove140那个同学145低调需要炫耀150PortB155螺丝侠164chenxi5525168hushigen169空空176bjxingch185a3781857188猪兔子202Jonathan122214chenzeshi216yyhl4283222xmushjj229kuaileguyue235linjiachen第一天打卡抽奖公示:    获奖楼层获奖昵称奖品5可雾的银定制水杯9麦哲伦 杰哥定制水杯13Jasmine-Lily定制水杯17haohaoandYY定制水杯21亦钊定制水杯22千度定制水杯24h12300定制水杯25胡琦定制水杯27地雷开花定制水杯29QINGUISO定制水杯36zhuanganmin定制水杯44爱学习 爱劳动定制水杯45秦玉安定制水杯54J丶徘徊定制水杯58无她亦果定制水杯68吉桐定制水杯69LazyBones定制水杯70Holmesc定制水杯74lihahagang定制水杯77如果河流会说谎定制水杯79Aiwaves定制水杯85yooh_Emi定制水杯87K_SORA定制水杯97神龙居市定制水杯99Casperflip定制水杯102果树苗定制水杯103hj007定制水杯107xmushjj定制水杯114揽星河入梦定制水杯119果力成定制水杯126张辉定制数据线129ynzhang定制数据线133憨憨请爱我定制数据线135双马尾可爱到家定制数据线136hw24283765定制数据线139马大力定制数据线147chen_hao定制数据线148HideOnStream定制数据线155一条龙定制数据线160那个同学定制数据线167珞瑜意定制数据线168╰*風の舞º定制数据线172qinglongdao定制数据线175shayne_yjl定制数据线176邹 佳磊定制数据线183linzhuofeng定制数据线188岳江涛定制数据线190螺丝侠定制数据线191zyknet定制数据线192GF11定制数据线197William10定制数据线203JackYu定制数据线205fengxiaode888定制数据线207小菜鸟菜又菜定制数据线210jn-zx定制数据线218hngc201810916139定制数据线224浪静天空定制数据线229Kansas定制数据线231杨蛟定制数据线232jim_real定制数据线235实柏定制卡包237宋如斌定制卡包250fanwenl定制卡包254Kingmier定制卡包255zherhui定制卡包257Venous定制卡包261华束隐定制卡包269PortB定制卡包272蔡智定制卡包274MrJiang定制卡包275LYanG定制卡包276Eleven丶定制卡包278Yishif定制卡包279河仙子定制卡包284piqingquan定制卡包286linjiachen定制卡包287乐享大数据定制卡包288chenzeshi定制卡包290Sunshine2020定制卡包292林酒酒定制卡包297杉树鹿夏定制卡包299qqz定制卡包309yzz163定制卡包308lovrmore定制卡包311aaron-hw定制卡包312hw13572552定制卡包315heinsea定制卡包323花花程度定制卡包320一硕定制卡包322朝惜定制卡包
  • [技术干货] 分享一个STM32F407的中文参考手册
    看到论坛上有想在STM32F407上移植LiteOS或者开发设备端的程序,在这里分享一个STM32F407的中文参考手册,助力大家顺利移植LiteOS、顺利开发设备端程序。
  • [技术干货] 《Huawei LiteOS设备开发实战》—FAQ(持续更新),萌新遇到问题先看这里
    账号、课程学习相关FAQ:1、学习这个课,要注册两个账号?    华为云账号用户登录华为云(活动报名、打卡、使用物联网平台),华为账号用于学习视频课程。2、华为账号和华为云账号有什么区别,一定要注册两个账号?    可以只注册华为账号,在华为云登录界面,可以选择使用华为账号登录。3、不知道在哪儿看视频,打卡,报名活动?    看群公告。物联网平台(IoTDA设备接入)相关FAQ1、为什么我的平台不能正常使用,各种报错?   (1)登录账号后,先去进行实名认证(2)检查下是否欠费(3)控制台区域选择北京四(4)检查下资源空间,没有资源空间的新建一个,有的用默认的即可2、上报数据,下发命令和视频中不一致?    仔细检查下功能定义和插件开发是否完全正确,是否和视频中一致,建议反复观看对比。3、messageID和mid什么区别?    messageID标记不同种类的消息,mid标记同一种消息,具体是哪一次下发的,设备回复命令响应时,带上mid,平台根据mid可以判断出具体是对哪一条命令的响应。4、设备如何激活? 在物联网平台中,激活就是将真实设备在平台进行注册后,和平台进行连接或者上报数据。更多请查看https://support.huaweicloud.com/qs-iothub/iot_05_0005.html#section3 5、NB-IoT使用电信物联卡,无法正常接入设备接入平台? 由于电信做了限制,电信卡只能连电信自己的平台,会出现接入设备接入平台失败或执行软固件升级失败等情况。 6、获取账号详细信息时后台出现错误,获取失败? 请确保华为云账号实名认证通过,并且账号不处于欠费状态。7、NB-IoT设备在线离线状态不实时更新? NB-IoT设备,大部分时间处于休眠状态,设备接入平台后,设备在超过49小时未上报数据,平台会将设备置为“离线”状态。建议根据是否获取到设备数据判断是否在线,而不是通过显示的设备状态。 MQTT设备通常处于长连接状态,因此可通过在线离线状态实时判断设备运行情况8、小熊派FAQ链接:https://bbs.huaweicloud.com/forum/thread-18757-1-1.htmlVSCode和IoT Link插件相关FAQQ: 安装完插件后底部没有Home按钮?A: 常见的原因是您使用了Linux/Mac版的VSCode,目前插件还不支持。Q: 安装完插件后底部没有Home按钮?A: 常见的原因是您使用了Linux/Mac版的VSCode,目前插件还不支持。Q: 新建的工程编译失败?A: 检查'用户设置'--'工具链'里的GCC工具目录是否配置正确,如果插件自动下载安装的GCC,路径为C:\Users\用户名\.iotlink\tools\gcc-arm-none-eabi\bin。若此处没有配置,则需要点击提示里的链接下载安装GCC,安装完成后填写GCC目录,一般为 C:\Program Files (x86)\GNU Tools Arm Embedded\9 2019-q4-major\binQ: 工程烧录失败?A: 失败可能的原因较多,可以做如下的尝试:检查开发板和电脑是否正确连接重新插拔USB线检查工程设置--'调试器'中的Adapter是否配置正确,OpenOCD类型的注意检查参数,JLink类型的检查设备名称是否和开发板匹配尝试重新安装STLink驱动Q: VSCode提示检测到#include错误,请更新includePath?A: 该错误为VSCode找不到gcc编译器的头文件,但并不影响实际的编译功能。如果想修复可打开当前工程的.vscode/c_cpp_properties.json,检查配置的includePath是否正确。一个参考的配置如下:"includePath": [  "C:/Program Files (x86)/GNU Tools Arm Embedded/9 2019-q4-major/arm-none-eabi/include",  "C:/Program Files (x86)/GNU Tools Arm Embedded/9 2019-q4-major/lib/gcc/arm-none-eabi/9.2.1/include",  "${workspaceFolder}/**",  "${sdkPath}/**"],1、本次嵌入式开发环境搭建要做什么?    只需要做这两步:(1)下载VSCode(2)VSCode内安装IoT Link插件2、VSCode在哪儿下载?    下载地址:https://code.visualstudio.com/,下载Windows64位Stable版3、编译失败?    检查IoT Link设置中的工具链GCC目录,是否设置到bin路径。    C:\XXX\GNU Tools Arm Embedded\9 2019-q4-major\bin4、VSCode如何设置中文界面?    看这里:https://bbs.huaweicloud.com/blogs/1693425、JLink下载慢?    不需要下载JLink,本次小熊派使用的是STLink,安装IoT Link过程中自动安装STLink,无需其他操作。6、GCC下载不了?    不需要单独下载GCC,安装IoT Link插件会自动安装GCC。7、烧录失败?    (1)没有小熊派开发板的,不需要执行烧录操作,只做打卡用不到烧录操作。    (2)检查下调试器配置是否正确。    (3)检查下是否将小熊派开发板用USB链接到电脑上。    (4)重新插拔下USB线。    (5)如果之前安装过STLink驱动,可以试下重装STLink驱动,驱动在帖子附件下载。8、能不能使用之前的IoT Studio?    熟练者可以使用,但不方便根据视频学习,本次课程视频里用的都是VSCode和IoT Link插件,建议用VSCode。9、安装完IoT Link插件,看不到Home?    不支持Linux、Mac,不支持Windows 32位。10、IoT Link插件是否支持Linux?    当前IoT Link插件仅支持windows 64位。
  • [问题求助] 如何在linux侧执行liteos的命令
    我在使用HI3556V200的开发平台,liteos和linux双系统, 如何设计一个脚本,可以在linux侧执行liteos的一个命令。(比如pqTool工具的执行,我想一开机就能自动运行起来,而不用再手动在执行命令)
  • [技术干货] 0x03 LiteOS内核详解--stm32启动流程(下)
    STM32复位后运行的第一条汇编代码当对STM32进行上电操作或者复位操作(按复位按钮,调用复位函数),STM32就会跳转到“中断向量表”中的地址0x0000_0004处执行已经写好的Rest_Hander处理函数,该函数使用汇编语言写的,在LiteOS中的如下位置“liteos\arch\arm\arm-m\armv7-m\gcc\los_startup.S”,1.  Reset_Handler:  2.      cpsid   i  3.      ldr     sp, =_estack            /* set msp, as it is not set in the vector */  4.    5.  #if defined (__VFP_FP__) && !defined(__SOFTFP__)    /* if FPU exist. */  6.      /* enable FPU */  7.    8.      ldr     r0, =0xE000ED88  9.      ldr     r1, [r0]  10.     orr     r1, r1, #(0xf << 20)                    /* enable cp10 cp11 both */  11.     str     r1, [r0]  12. #endif  13.   14.     /* init the data section */  15.   16.     ldr     r1, =_sdata  17.     ldr     r2, =_edata  18.     ldr     r3, =_sidata  19. 0:  20.     cmp     r1, r2  21.     beq     0f  22.     ldr     r0, [r3], #4  /* 将_sidata地址对应内存中的数据读到r0中,并将_sidata地址加4 */23.     str     r0, [r1], #4  /* 将R0中的数据写到_sdata地址对应内存中,并将_sdata地址加4 */24.     b       0b  25. 0:  26.   27.     /* init the bss section */  28.   29.     mov     r0, #0  30.     ldr     r1, =_sbss  31.     ldr     r2, =_ebss  32. 0:  33.     cmp     r1, r2  34.     beq     0f  35.     str     r0, [r1], #4  36.     b       0b  37. 0:  38.     bl      SystemInit  39.     bl      __libc_init_array  40.     bl      main  41.   42.     b       .  43.   44. .size  Reset_Handler, . - Reset_Handler 第2行:关闭所有中断,等价于PRIMASK=1第3行:读取栈顶指针并赋值给sp寄存器,这个“_estack”符号的值定义在链接脚本中,os.ld文件* 中,取决于芯片RAM大小。第5~11行,MPU初始化,暂不讲解。第16行,将_sdata段的起始地址赋值给r1寄存器第17行,将_edata段的起始地址赋值给r2寄存器第18行,将_sidata段的起始地址赋值给r3寄存器上面这三个符号的值都来自于os.ld文件中,_sdata~_edata之间的空间用于存放全局变量的值,所以在初始化中,需要将这块空间清0。       第19~24行,首先使用cmp     r1, r2判断r1和r2寄存器中的值是否相等也就是_sdata和_edata的值是否相等,一开始肯定不相等,就不执行跳到0f地址处的这条指令了,注意:0f和0b这样写法你们可能很少见,0是标签0,就是代码块前面的那个0,我们的这个文件中有很多为0的标签,所以就通过b=backward和f=forward来区分是跳到后面的标签0处还是前面的标签0处,前面和后面不好区分,可以根据back单词有返回的含义来进行区分。总体看来19~24行就是一个for循环,判断退出循环的条件是_sdata和_edata的值是否相等,在循环中将全局变量的数据从flash拷贝到ram的加载地址对应空间中。ldr R0,[R3],#4 ;将存储器地址为R3的字数据读入寄存器R0,并将R3+4的值存入R3。str R0,[R1],#4 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+4写入R1       第29-36行,采用上面的类似于“for循环”的方法将.bss段清0.       第37-40行,执行SystemInit函数,用C语言在外部实现的,执行__libc_init_array函数,执行我们自己实现的main函数,单片机就转起来了!
  • [技术干货] 0x02 LiteOS内核详解--浅谈程序编译
    摘要:编译一个程序时,看似点击IDE中的build按钮或者输入一句gcc xx.c -o xx就完成了编译,其实这中间发生了很多有趣的步骤,下面我们以GCC工具链为例,让我带着大家一起来看看吧,这样有助于后面理解LiteOS中的中断接管机制以及driver层设备注册等等。 一个xxx.c文件编译为xxx.hex/.bin文件经历了哪些步骤? 预处理下图是hello.c文件内容,打印A的值,A变量定义在A.h文件中下图是A.h文件内容:我现在使用如下命令gcc -E hello.c -o hello.E,让hello.c文件只预处理,得到hello.E文件,其中已经用在A.h文件中的“int A = 18;”语句对hello.c文件中的#include ”A.h”进行了替换,如图:编译编译的本质就是将C语言代码翻译为汇编代码,gcc -S hello.c -o hello.SHello.S文件的部分内容: 汇编        汇编就是将汇编代码转换为机器码的过程:gcc -c hello.S -o hello.o,因为机器码文件里面全部都是由0\1二进制组成,所以我们无法直接看懂,我这里使用nm hello.o查看其中的符号:        上面的”00000000000”是指这些符号所处的地址,因为没有链接所以地址为0,D是指在该符号定义在的初始化数据段,U是指该符号没有在该文件中定义,需要等链接的时候去其他文件中寻找,T是指该符号位于代码区。链接链接就是将Hello.c文件中用到的外部函数和其本身的函数根据链接脚本(这里用的是默认链接脚本,例如LiteOS中的链接脚本是os.ld)的要求链接到一起,生成可执行文件,我这里使用gcc hello.o -o hello,链接生成可执行文件hello,我们用到了printf库函数,链接器就会去库中帮我们寻找prinf函数并链接在一起。执行./hello,就可以得到如下打印:用nm查看hello可执行程序,这次就能得到所有数据和函数的地址了:  
总条数:623 到第
上滑加载中