-
将liteos移植好之后,南向北向通了,但遇到了一个问题。我想通过通信模块获取设备的定位信息,也就是MCU给通信模块发送一个AT指令,但我怎么在liteos上获取这个AT指令的具体返回值?我找了一些接口函数,里面返回的都是通信模块的通信数据(+RECEIVE,id,len:xxxx)。想请教下,还有没有其他办法能够获取这些指令的返回值?(除了在串口中断上直接获取)
-
1串口 摘要:主要讲解物联网的技术积累,首先从串口开始,本文基于GD32450i-EVAL对串口以及其通信做了一个简要的分析,以及开发过程中遇到的一些技术问题以及解决方案。1.1 定义 串口即串行端口,泛指采用所有采用串口通信时序的接口,一般在嵌入式中默认为UART口。1.2 串口的作用 (1)通过串口将程序下载到开发板 (2)显示调试日志实现对于运行程序的监控。 (3)通过串口发送或接收命令实现终端与开发板的信息交互。2 串口通信2.1 定义 在串口中,数据按顺序一位一位的传输,该传输方式成为串口通信。2.2 串口通信的传输方向 (1)单工:数据只可以沿一个方向传输。 (2)半双工:数据可以分时的沿着两个方向传输,即不能同时进行。 (3)全双工:数据可以同时进行双向传输。2.3 波特率 波特率指的是每秒传输多少位数据,即传输率。常用波特率为9600和115200.2.4 数据包 数据包 = 起始位 + 数据位 + 校验位 + 结束位3 GD32F450i的串口 对于GD32F450i开发板主要通信接口包含4个USART(USART0/1/2/5)和4个UART(UART3/4/6/7)。以USART0为例,具体原理图如图1所示。图1 串口原理图 由上图可知,引脚PA9和PA10位串口USART0的数据输入(接收)引脚RX和数据输出引脚TX。4 串口初始化的步骤(1) 使能GPIO的时钟。(2) 使能UART0的时钟。(3) 设置USART TX的引脚或端口。(4) 设置USART RX的引脚或端口。(5) 设置USART TX对应引脚为推挽输出工作模式。(6) 设置USART RX对应引脚为推挽输出工作模式。(7) 设置波特率为115200。(8) 使能Rx、Tx端口。4.1 串口模式 (1)普通模式:在主函数中接收函数,输出字符串到串口。 1)开发环境 Windows、Keil、Jlink下载器、GD32F450i-EVAL(2019) 注意:若使用的MDK版本为Keil5.25以后,打开项目时以及使用J-Link下载器烧录程序时可能会报错,针对可能出现的问题进行分析以及解决,链接为https://bbs.huaweicloud.com/blogs/123604。 2)程序重点 为实现通过printf函数打印字符串和输出实时数据到串口助手,需要重写fputc函数,同时添加头文件 #include "stdio.h",重写函数如下所示。 int fputc(int ch, FILE *f) { usart_data_transmit(EVAL_COM1, (uint8_t)ch); while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TBE)); return ch; } 3)硬件连接 连接USB供电线后,将J-Link下载器连接到开发板的JTAG接口上,之后连接到PC端,若LED5点亮说明选择了正确的启动方式,供电正常。硬件连接图如图2所示。供电方式选择GD-Link,串口采用九孔com口串口线(本文中使用杜邦线代替)连接。图2 硬件连接图之后点击keil5的编译和烧录按钮,如图3所示。图3 编译与烧录上述过程实现了下载程序到开发板,用跳线帽将JP5跳到USART0上,并将串口线连接到开发板的COM0上,例程首先将输出“USART printf example: please press theTamper key”到超级终端。按下 Tamper 键,串口继续输出“USART printf example”。通过串口输出的信息如图4所示。图4 串口输出(一)(2)中断模式:产生的不影响主程序运行。主函数中需要使能接收中断和发送中断即分别将对RBNE和TBE状态寄存器进行操作,触发中断。测试时首先,所有的LED灯亮灭一次。然后EVAL_COM0将首先输出数组 tx_buffer 的内容(从 0x00 到 0xFF)到支持 hex 格式的串口助手并等待接收由串口助手发送的 BUFFER_SIZE 个字节的数据。MCU 将接收到的串口助手发来的数据存放在数组 rx_buffer 中。在发送和接收完成后,将比较 tx_buffer 和rx_buffer 的值,如果结果相同,LED1,LED2,LED3 轮流闪烁;如果结果不相同,LED1,LED2,LED3 一起闪烁。通过串口输出的信息如图5所示。图5 串口输出图(二)(3)DMA模式:与主函数互不影响,独立运行。主函数中需要先使能USART0的发送和接收DMA通道,触发DMA。对于测试,DMA测试过程与中断方式相同。通过串口输出的信息如6所示。图6 串口输出(三) 通过以上的开发流程,对于物联网中的串口有了更深的认识。(https://bbs.huaweicloud.com/blogs/123935)主文博客链接:https://bbs.huaweicloud.com/blogs/124244
-
1串口 摘要:主要讲解物联网的技术积累,首先从串口开始,本文基于GD32450i-EVAL对串口以及其通信做了一个简要的分析,以及开发过程中遇到的一些技术问题以及解决方案。1.1 定义 串口即串行端口,泛指采用所有采用串口通信时序的接口,一般在嵌入式中默认为UART口。1.2 串口的作用 (1)通过串口将程序下载到开发板 (2)显示调试日志实现对于运行程序的监控。 (3)通过串口发送或接收命令实现终端与开发板的信息交互。2 串口通信2.1 定义 在串口中,数据按顺序一位一位的传输,该传输方式成为串口通信。2.2 串口通信的传输方向 (1)单工:数据只可以沿一个方向传输。 (2)半双工:数据可以分时的沿着两个方向传输,即不能同时进行。 (3)全双工:数据可以同时进行双向传输。2.3 波特率 波特率指的是每秒传输多少位数据,即传输率。常用波特率为9600和115200.2.4 数据包 数据包 = 起始位 + 数据位 + 校验位 + 结束位3 GD32F450i的串口 对于GD32F450i开发板主要通信接口包含4个USART(USART0/1/2/5)和4个UART(UART3/4/6/7)。以USART0为例,具体原理图如图1所示。图1 串口原理图 由上图可知,引脚PA9和PA10位串口USART0的数据输入(接收)引脚RX和数据输出引脚TX。4 串口初始化的步骤(1) 使能GPIO的时钟。(2) 使能UART0的时钟。(3) 设置USART TX的引脚或端口。(4) 设置USART RX的引脚或端口。(5) 设置USART TX对应引脚为推挽输出工作模式。(6) 设置USART RX对应引脚为推挽输出工作模式。(7) 设置波特率为115200。(8) 使能Rx、Tx端口。4.1 串口模式 (1)普通模式:在主函数中接收函数,输出字符串到串口。 1)开发环境 Windows、Keil、Jlink下载器、GD32F450i-EVAL(2019) 注意:若使用的MDK版本为Keil5.25以后,打开项目时以及使用J-Link下载器烧录程序时可能会报错,针对可能出现的问题进行分析以及解决,链接为https://bbs.huaweicloud.com/blogs/123604。 2)程序重点 为实现通过printf函数打印字符串和输出实时数据到串口助手,需要重写fputc函数,同时添加头文件 #include "stdio.h",重写函数如下所示。 int fputc(int ch, FILE *f) { usart_data_transmit(EVAL_COM1, (uint8_t)ch); while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TBE)); return ch; } 3)硬件连接 连接USB供电线后,将J-Link下载器连接到开发板的JTAG接口上,之后连接到PC端,若LED5点亮说明选择了正确的启动方式,供电正常。硬件连接图如图2所示。供电方式选择GD-Link,串口采用九孔com口串口线(本文中使用杜邦线代替)连接。图2 硬件连接图之后点击keil5的编译和烧录按钮,如图3所示。图3 编译与烧录上述过程实现了下载程序到开发板,用跳线帽将JP5跳到USART0上,并将串口线连接到开发板的COM0上,例程首先将输出“USART printf example: please press theTamper key”到超级终端。按下 Tamper 键,串口继续输出“USART printf example”。通过串口输出的信息如图4所示。图4 串口输出(一)(2)中断模式:产生的不影响主程序运行。主函数中需要使能接收中断和发送中断即分别将对RBNE和TBE状态寄存器进行操作,触发中断。测试时首先,所有的LED灯亮灭一次。然后EVAL_COM0将首先输出数组 tx_buffer 的内容(从 0x00 到 0xFF)到支持 hex 格式的串口助手并等待接收由串口助手发送的 BUFFER_SIZE 个字节的数据。MCU 将接收到的串口助手发来的数据存放在数组 rx_buffer 中。在发送和接收完成后,将比较 tx_buffer 和rx_buffer 的值,如果结果相同,LED1,LED2,LED3 轮流闪烁;如果结果不相同,LED1,LED2,LED3 一起闪烁。通过串口输出的信息如图5所示。图5 串口输出图(二)(3)DMA模式:与主函数互不影响,独立运行。主函数中需要先使能USART0的发送和接收DMA通道,触发DMA。对于测试,DMA测试过程与中断方式相同。通过串口输出的信息如6所示。图6 串口输出(三) 通过以上的开发流程,对于物联网中的串口有了更深的认识。主文博客链接:https://bbs.huaweicloud.com/blogs/124244
-
发现很多人在LiteOS的移植过程中总会遇到一些问题,现在简单做一些总结。后续有新的问题提再继续补充。1、CMSIS版本导致的问题问题现象一般如下图所示,编译后报错,Undefined symbol __get_IPSR (找不到 符号__get_IPSR )。分析:该问题一般出现在stm32f103系列的单片机使用标准库移植的情况下。F103系列单片机标准库只更新到3.5版本,cmsis版本较低。内核相关的文件中缺少 __get_IPSR 函数。解决办法有三种: 1、将标准库替换成HAL库。(代码改动大,有些人可能不愿意。但hal库是趋势,建议大家及早准备) 2、从mdk安装目录中复制最新的cmsis文件出来,替换掉当前工程目录下的文件。 即将MDK安装目录下 Packs\ARM\CMSIS\5.5.1\CMSIS\Core\Include 目录下的头文件,复制到当前工程目录下CMSIS头文件路径下。 3、将liteos源码中arch\arm\common\cmsis 目录下的文件,复制到当前工程目录下CMSIS头文件路径下。2、无法下载和调试代码问题现象一般是:首次下载代码后,无法进行调试,找不到器件;有的情况下也无法再下载程序。分析:该问题一般是由于使用STM32CubeMX生成裸机工程导致的。在配置时,没有使能Debug功能,导致调试接口禁用。解决方法:配置时,要使能串行调试功能(如果使用的是SWD接口)。如下图:如果由于禁用了SWD导致已经不能下载程序了,那么需要先按住CPU的复位,然后再点击下载程序。3、没有重定向printf导致程序死掉内核在运行过程中,有时会打印一些日志,打印函数使用的是printf。因此,如果没有重定向printf函数,那么会导致程序死掉。或者,你可以关闭日志打印功能,不使用printf函数。重定向printf的示例代码如下,需要勾选使用微库:///重定向c库函数printf到USART1 int fputc(int ch, FILE *f) { /* 发送一个字节数据到USART1 */ UART_SendByte(USART1, (uint8_t) ch); return (ch); } ///重定向c库函数scanf到USART1 int fgetc(FILE *f) { /* 等待串口1输入数据 */ while((USART1->SR&UART_FLAG_RXNE)==0); return (int)USART1->DR&0xff; }4、关于OS是否托管中断个人建议在移植的时候选择OS不托管中断(LOSCFG_PLATFORM_HWI 定义为 NO)。如果选择OS托管中断(LOSCFG_PLATFORM_HWI 定义为 YES),那么移植相对比较复杂:1.需要修改启动文件,将通过DCD指令开辟的中断向量表删除;2. 同时,要修改sct文件,加入中断向量表存储地址相关的内容。写程序时,应在内核初始化之后,再使用 LOS_HwiCreate 创建中断,绑定中断处理函数。在内核初始化之前调用LOS_HwiCreate 是无效的,切记。5、关于时间片轮转如果 LOSCFG_BASE_CORE_TIMESLICE 定义为 NO ,关闭时间片轮转,则任务无法按时间片方式调度。即:当任务优先级相同时,若任务不主动阻塞自己,则不会触发进行任务调度。表现为:如果创建了两个相同优先级的任务,则其中一个任务会一直占用 CPU,另外一个任务无法得到执行。6、其他问题其他问题,大家可以按如下方式排除:1、排除配置问题,可以对比target_config.h中的宏定义,找出自己是否有配置不对的地方2、在线调试,日志打印等。至于使用问题,可以仔细阅读官方教程,还是蛮详细的。在实际项目过程中,总会遇到各式各样的问题,大家需要掌握调试手段,善于解决问题,提高自己的能力!
-
大家好,请问LiteOS中如果某一段代码运行过程中不希望发生任务调度该怎么做?在这段代码运行期间,高优先级任务不能打断低优先级任务。能不能在运行这段代码之前把优先级变为最高?或者是类似UCOS进入临界区,LiteOS需要怎么做?
-
先做的LiteOS移植,通过STM32 cube 创建的裸机工程,之后移植的LiteOS,没有问题准备移植端云互通组件的时候遇到问题,网上参考了一些教程,是根据最新的develop分支的代码进行的移植,移植完之后很多错误各位大神有没有在LiteOS之上,移植端云互通组件的?我用的是原子的SMT32F1精英版
-
### 华为Liteos和物联网设备侧sdk移植到stm32F03ZE霸道板子上 ### 啥是LIteos “开源免费”的实时操作系统,集成了 LwM2M、CoAP、mbed TLS、LwIP 全套 IoT 互联协议栈,且在 LwM2M 的基础上,提供了 AgentTiny 模块,用户只需关注自身的应用,而不必关注 LwM2M 实现细节,直接使用 AgentTiny 封装的接口即可简单快速实现与云平台安全可靠的连接。属于国产的实时操作系统(RTOS) ### 基于标准库移植 下载源码,[https://github.com/LiteOS/LiteOS](https://github.com/LiteOS/LiteOS)\ ### 往裸机工程添加 LiteOS 源码 打开 LiteOS 源码文件,可以看见里面有 8 个文件夹,下面先来了解一下主要的文件夹及其子文件夹的作用,然后将 LiteOS 源码的核心文件提取出来,添加到工程根目录下的文件夹中,因为工程只需要有用的源码文件,而不是整个 LiteOS 源码, ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190929165628332-715049345.png) ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190929170103804-1587161396.png) ### 添加LiteOS 系统的一些配置文件,含原厂芯片驱动 ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190929171305177-1794625631.png) ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190929171354402-1649263409.png) >将 OS_CONFIG 文件夹下面的一些配置文件拷贝到刚刚提取的 LiteOS 核心文件夹下面,等下在移植工程的时候大家是需要对这个文件夹下的某些文件进行修改,以适配不同的工程配置,并且可以通过修改这个文件夹下的内核配置头文件来裁剪 LiteOS 的功能。 添加 CMSIS的库,可以打开工程在mdk里面添加,也可以新建\Libraries\CMSIS\include,include文件夹从 keil 安装目录下C:\Keil_v5\ARM\Pack\ARM\CMSIS\5.3.0\CMSIS\Include,将其包含进来可以避免其它电脑 在移植过程中没有相关头文件而引起的编译错误 ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190929173748976-1019510793.png) ### 打开工程,添加 LiteOS 核心源码到工程组文件夹 需 要 在 开 发 环 境 里 面 新 建 LiteOS/cmsis 、 LiteOS/kernel 、 LiteOS/arch 和LiteOS/config 四个文件分组,其中 LiteOS/cmsis 用于存放 LiteOS 文件夹下 cmsis 文件夹的内容,LiteOS/kernel 用于存放 LiteOS 文件夹下 kernel 文件夹的内容,LiteOS/arch 用于存放LiteOS 文件夹下 arch 文件夹的内容。而 LiteOS/config 用于存放 LiteOS 文件夹下的OS_CONFIG 文件夹的内容。 ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190929180603458-355636054.png) ### 指定 LiteOS 头文件的路径 ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190929181731297-1104360672.png) ### 修改liteos/config文件下的target_config.h,修改自己板子对应的头文件 ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190929211228476-1531035796.png) 修改LOSCFG_PLATFORM_HWI,如果是YES代表接管中断,否则不被接管 非接管中断版本的 target_config.h 文件就需要在 LiteOS 提供的 demo 中移植过来 , 比 如 : LiteOS\targets\STM32F103RB_NUCLEO\OS_CONFIG,启动文件不变,保留stm32f10_it.c但需要注释 void PendSV_Handler(void)与 SysTick_Handler(void)这两个函数 接管中断版本的target_config.h文件就需要从 LiteOS 官方写的工程文件夹下面拷贝过来的,路径为\LiteOS\targets\ STM32F429IGTx_FIRE\OS_CONFIG ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190930100928785-2023022556.png) #### 启动文件内容修改(接管中断,非接管不用管) 因为 LiteOS 接管中断版本的中断向量表是由系统管理的,所以裸机的启动文件是要不得的,必须替换掉, ![](https://img2018.cnblogs.com/blog/1252747/201910/1252747-20191008104151372-1925477442.png) ### 分散加载文件修改(接管中断方式,非接管不用管) 在 LiteOS 中,中断向量表被放在运行内存里,避免影响分配内存,那么就需要将代码分散加载到不同的区域中,华为官方提供的分散加载文件就在每个具体的工程文件目录下,如 : LiteOS \targets\ STM32F429IGTx_FIRE\MDK-ARM 文 件 夹 下 的 STM32F429IGTx-LiteOS.sct 文件。首先将它拷贝到我们自己的工程中去,并且将其名字修改为“Fire-F103-LiteOS.sct”,放在工程的 user 文件夹中,然后在工程中把 “Fire-F103-LiteOS.sct”文件到工程配置中 ![](https://img2018.cnblogs.com/blog/1252747/201910/1252747-20191008104334018-556501291.png) ![](https://img2018.cnblogs.com/blog/1252747/201910/1252747-20191008104507645-76129025.png) ![](https://img2018.cnblogs.com/blog/1252747/201910/1252747-20191008104633993-793787697.png) ### 修改中断相关文件(非接管中断,接管中断不用管) 由于 LiteOS 已经处理好 PendSV 与 SysTick 中断了,就不需要用户自己处理,所以要在中断相关的源文件(stm32fxxx_it.c)中注释(删除)掉 void PendSV_Handler(void)与 SysTick_Handler(void)这两个函数。 ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190930101858775-1345258687.png) ### 更新core_m3.h版本到4.3,复制粘住就可以了 打开keil安装目录,把版本新的cmsis的include替换工程下的cmsis的include,防止你的工程的cmsis的include版本低于4,同时 ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190930152043966-1154931939.png) ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190930152212679-60855898.png) ### 修改工程配置 在 LiteOS 中,需要 C99 标准的支持,并且忽略相关的警告,选择“target”→ “C/C++”,在“Misc Controls”选项中输入--diag_suppress=1,47,177,186,223,1295,意思是忽略这些编号的警号, ![](https://img2018.cnblogs.com/blog/1252747/201909/1252747-20190930102943835-211837719.png) 经初步完成工程的移植了,LiteOS 的接管中断比非接管中断方式要麻烦很多,所以推荐在 cortex-m 系列处理器中采用非接管中断方式移植工程, ### 在main文件添加led任务 ``` #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "stm32f10x.h" #include "los_sys.h" #include "los_task.ph" UINT32 LED_Task_Handle; static UINT32 AppTaskCreate(void); static UINT32 Creat_LED_Task(void); static void LED_Task(void) int main(void) { UINT32 uwRet = LOS_OK; delay_init(); LED_Init(); /* LiteOS Äں˳õʼ»¯ */ uwRet = LOS_KernelInit(); if (uwRet != LOS_OK) { printf("LiteOS ºËÐijõʼ»¯Ê§°Ü£¡Ê§°Ü´úÂë0x%X\n",uwRet); return LOS_NOK; } uwRet = AppTaskCreate(); if (uwRet != LOS_OK) { printf("AppTaskCreate´´½¨ÈÎÎñʧ°Ü£¡Ê§°Ü´úÂë0x%X\n",uwRet); return LOS_NOK; } LOS_Start(); while(1); } //其余见下载附件 ``` ### 运行结果 ![](https://img2018.cnblogs.com/blog/1252747/201910/1252747-20191007210722571-1942518665.png) ![](https://img2018.cnblogs.com/blog/1252747/201910/1252747-20191007210800003-1299511617.png) 工程见网盘: ``` 非接管中断: 链接:https://pan.baidu.com/s/1UQ2L6nZfoqFaa3DL2l20TA 提取码:ikrv 复制这段内容后打开百度网盘手机App,操作更方便哦 接管中断: 链接:https://pan.baidu.com/s/1UbFJy7wRztPnQWQhLrjavg 提取码:95pf 复制这段内容后打开百度网盘手机App,操作更方便哦 ```
-
我按照GITHUB上的指导,把LITEOS移植到STM32F103ZET6最小系统上。出现了以下一个错误这个要怎么解决?
-
### 问题一:iteos下的target_config.h中的#defind LOSCFG_PLATFORM_HWI YES 是代表接管系统中断吗?,那我标准库的stm32f10x_it.c是不是可以直接去掉?假设去掉stm32f10x_it.c后是不是要修改启动文件,那华为有提供接管中断的启动文件的参考代码?或者例程代码吗?或者要自己修改?,怎么修改,有教程吗?,我的板子是stm32F103ZET ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201909/29/235017pdnubtpeteagdw69.png) - ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201909/29/2340285gduz0wsmrcrwlu7.png) ### 问题二:板子是有人物联网的,看似有二次封装指令,官方的指令指导书没有我上图红框的指令,有人在4G模块板子集成多了一个stm32,更可怕的是很多指令没有OK回应,直接就是结果或者没结果就不回应, 如何没有红框的指令,是不是要换通信模块,或者又其他办法吗,或者帮我看看该模块的AT指令说明书,看看是不是可以有指令实现?换,有推荐的4g模块,最好有那种别人写好的通信驱动.c文件的模块, - ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201909/29/234107soegrmzrpxho89lx.png) - ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201909/30/085406dcxkb3sduqo3huu2.png) - USR_G700模块AT指令见附件 ### 问题三 - ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201909/30/092440qbenr1yeartpmsj2.png)
-
按照LiteOS中文网移植教程进行移植后,编译0 Error,0 Warning. 但内核加载就是失败。调试发现卡在LOS_KernelInit();OS_Config也已经配置了内存大小。
-
我按照GITHUB上的指导,把LITEOS移植到正点原子的STM32F1精英版开发板上。碰到了一些问题。流程上完全遵循指导,用STM32Cube构建了裸机工程。完成度100%移植OS用MDK-ARM,完成度也是100%。编译成功了.HEX,并成功用ST-LINK写入到了开发板。问题来了,这个开发板一旦写入了我交叉编译过的.HEX文件。则LED0,LED1,PWR指示灯全部亮起。对外的ST-LINK调试就失联了,连不到核心了。这个步骤就失败了。我修改了BOARD_SRAM_SIZE_KB 的数量为64,工作频率72MHZ.在这个失败的结果之上如何调试我就束手无策了。请大家指导我,谢谢。
-
对于很多新手来说,都会遇到这样一个问题,这么多代码,我要从哪里开始学,我要怎么去学习?要怎么快速上手一套代码?先介绍一个定律:二八定律二八定律是19世纪末20世纪初意大利经济学家帕累托发现的。他认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的,简单来说,就是抓住关键的代码。我介绍一下我学代码的方法,给大家做个参考。首先,就是先把代码运行起来。用起来。把样例跑起来。开调试信息,多操作,看看执行流程!然后再对比差异,找到修改点,在什么地方,加什么代码实现什么功能。一点点往外扩展学习。使用工具:Beyond Compare 4使用的代码:github下载的liteos源码。https://github.com/LiteOS/LiteOS小熊开发版提供的两套代码。未完待续。。。
-
学习了多任务后,别人的工程看起来也就不那么无从入手,起码知道main函数开始,一步一步创建不同的任务,实现具体的功能,但是这只是开始,看别人工程时,还有很多内容估估下,不能肯定,所以按华为的手册继续学习liteOs的内核编程是很多必要的,即使不知道现在学来有什么用。今天学习动态内存分配,先华为提供了那些函数,如下图:现在开始看代码,首先分配一块固定内存块(编译时指定),内存块指针类型为UINT32,所以把字条大小为256这个值除4。要进行动态分配/释放之前,需要先对该编译时指定的内存空间进行初始化,调用函数为LOS_MenInit,参数为内存空间的指针和字节为单位的大小,这个函数是内核心提供的,如果我们只关心liteos的应用,不打算开发自己的liteos,可以不去深入研究,只要知道必须先init一下就可以。接下来就是基于这个内存块进行动态分配和释放操作,分配用LOS_MemAlloc函数,释放用LOS_MenFree函数,第一个参数都是编译时分配的那个固定内存块的名称(指针),对于MemAlloc,第二个参数是要分配的内存大小(字节大小);对于MenFree,第二个参数是分配出来的动态内存的地址。1、假如编译分配的内存大小为256字节,MemAlloc的最大可分配空间只有160-170之间,因为管理有开销2、MemAlloc可以分配多块动态内出来3、可动态分配,动态释放
-
课程打卡要求显示平台下发指令给设备,同时设备需要对平台指令进行正确回应,这就要搞清楚liteOs接收平台指令的处理机制方法跟以前一样,从main函数开始研究,首先是create_work_tasks,最后找到demo_nbiot_only函数里面有los_nb_notify和nb_iot_entry两个函数,nb_cmd_data_ioctl注册了nb_cmd_data_ioctl和OC_cmd_match具体注册过在at.oob_register这个函数里面,具体如可实现,暂时没有时间研究,后面有机会再看进nb_cmd_data_ioctl里面详细看一看,用sscanf获取下行指令的长度和hex文本根据指令完成相关处理,然后把回复内容放到s_resp_buf就可以,经测试可以正常接收平台指令,平台能检测到返回结果
-
对于小项目,我更愿意用祼机编程,简单直接快速,所以一直没有学习RTOS系统,现在是时候开始RTOS的学习了,所以计划好好拿下LiteOS。经过两天的折腾,用编译方面的问题已有些认识,今天开始多任务。多任务的相关函数如下先把我自己学习到的,认为关键的内容总一下:1、在main函数中创建任务,创建时要给出入口函数,任务代码放在相应的入口里面2、任务可以挂起,可以恢复,挂起后不会被调度,不占用CPU,必须用代码进行恢复,不然永远得不到调度3、LOS延时不会占用CPU(任务不会被调度),不同于while循环的延时首先了解创建任务,函数LOS_TaskCreate,参数一个ID,一个结构体,结构体配置了入口函数和优先,还有名称和栈大小。接下要知道如何挂起任务接下来是恢复任务有了上面的认识,其它函数看名字就基本知道用法,也就不再详细讲了。
上滑加载中
推荐直播
-
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月发布的新特性,并在直播过程中为您答疑解惑。
去报名
热门标签