-
最近在看 MCU 选型,哪里可以看到目前 LiteOS 支持的 MCU 型号列表?
-
本篇讲述如何分析官方或者其他友商提供的工程文件,在此基础上写出自己的工程文件,这是一种分析的方法,只有掌握了这样的方法,你才能快速学习一个新的东西,会自己独立思考问题,不是所有项目都有很好的技术支持,大部分都是靠自己,甚至说明文档都很少,只能阅读别人的代码,从而知道其思想和内部原理。 由上至下整体分析拿到一份工程文件的第一件事不是直接去阅读其源码,如果直接去阅读源码可能会一头雾水,应该先分析其结构,在心中有个大的方向,再去阅读源码并更正心中的想法,这样才能做到最高效,在阅读的过程中还可以把觉得不好的地方记录下来,在自己后面开发得工程中加以改善。我们这里以SDK/targets/STM32L431_BEAR工程文件为例,带领大家阅读和分析。Demos:存放操作系统之上,用户逻辑代码。GCC:存放Makefile文件、链接脚本、编译过程中间文件。Hardware:存放平台特有硬件驱动代码(例如显示屏和各类拓展板)。Inc:存放头文件。OS_CONFIG:存放操作系统的配置文件。Src:存放单片机的外设初始化文件及main.c文件。uart_at:存放at使用的串口初始化和驱动代码文件。.config:Kconfig生成的配置文件.config_old:没使用到,可以忽略。Iot_config.h:Kconfig生成的配置头文件(主要通过宏定义来使能一些组件)。Kconfig:Kconfig读取该文件显示图形化配置选项。 根据以上分析,我们首先要将通过STM32CubeMX生成的工程调整结构,尽量和上面相同,因为工程的编译是依赖Makefile来进行,Makefile可以使用官方案例工程中提供的Makefile在GCC目录中,其原理是根据目录来指定需要被编译的文件,所以我们将自己的工程结构调整的尽可能与上面相同,便于适配Makefile,减少工作量。 Demo目录中有多个目录,每一个目录对应一个用户例程,我们可以如法炮制,根据自己的项目需求在Demo目录中新建一个xxxx(需求名称)的目录,并在目录中新建一个xxxx.c源文件,修改user_demo.mk,在其中添加上我们这个工程目录中源文件的信息,后面才能选择编译。GCC目录中存放多个链接脚本和Makefile文件,我们使用到的是Makefile、project.mk、os.ld这三个文件,重点修改project.mk和os.ld让其适配我们的工程目录和MCU型号。Hardware目录中存放板载外设的驱动,例如板子上特有的LCD显示屏、各种拓展板卡上的传感器,例如温度、湿度、光照传感器的驱动代码,我们可以移除没有用到的驱动代码,添加上自己开发板特有的传感器驱动,供用户代码调用。Inc目录存放单片机上各类外设的驱动代码的头文件,我们可以移除没有使用到的文件,添加上用到的单片机外设的驱动头文件,直接从STM32CubeMX生成的Makefile工程中的Inc目录中复制过来即可。OS_CONFIG目录中的文件用于控制LiteOS和调试信息的输出,我们可以根据需求,进行一些修改,例如通过target_config.h文件设置最大支持的信号量个数,是否采用硬件接管机制等等,一般不用设置,保持默认即可。Src目录中存放单片机上各类外设的驱动代码以及main函数的入口文件main.c,该文件直接使用即可,可以从STM32CubeMX生成的Makefile工程中的Src目录中复制一些用到的单片机外设驱动文件到该目录中,移除一些没有用到的文件。uart_at目录中存放发送AT指令控制外部支持AT指令的模块的串口驱动代码,包括串口初始化、实现一个数据结构,用于保存接收到的数据,供用户代码读取等。其余文件均不用修改,.config和iot_config.h文件由Kconfig根据SDK配置自动生成。下一节开始调整工程结构。
-
STM32L431的提供了丰富的中断资源,例如大部分GPIO引脚都具有中断功能。但是其中断功能的理解和使用略显复杂。这里首先简述了TM32L431的中断优先级分组功能,并分析了GPIO中断功能及配置方法步骤,其次简述了LiteOS系统中断应用方法,最后在IoT Link Studio中,以小熊派开发板为硬件基础,在LiteOS系统中实现了外部按键中断检测及LCD显示功能的程序实例。1.STM32L431的中断系统STM32L431采用了Arm Cortex-M4内核,具有丰富的中断资源,大部分的GPIO引脚都具有中断功能。对于这些丰富的中断的管理,STM32也有相对复杂的中断管理功能。在程序中使用中断,首先要进行中断优先级的分组设置,那我们也就先从中断优先级分组开始。1.1 中断优先级分组管理所有的中断的优先级进行分组管理。分成0-4组,分别确定了每组抢占优先级和响应优先级数值所占据的位数,在stm32l4xx_hal_cortex.h中有如下宏定义和说明。/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group * @{ */ #define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007) /*!< 0 bit for pre-emption priority, 4 bits for subpriority */ #define NVIC_PRIORITYGROUP_1 ((uint32_t)0x00000006) /*!< 1 bit for pre-emption priority, 3 bits for subpriority */ #define NVIC_PRIORITYGROUP_2 ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority, 2 bits for subpriority */ #define NVIC_PRIORITYGROUP_3 ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority, 1 bit for subpriority */ #define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority, 0 bit for subpriority */每个中断都可以设置抢占优先级的等级数值和响应优先级的等级数值。这里需要理解清楚,抢占优先级和响应优先级的功能作用。抢占优先级高的中断可以打断抢占优先级低的中断,抢占优先级相同的中断是不能相互打断的。当抢占优先级相同的多个中断同时发生时,响应优先级高的中断会首先被响应。中断优先级需要在硬件初始化阶段配置完成,一旦配置好后,就不能在修改。在HAL库中,调用如下函数进行配置void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)例如,如下代码,设置优先级管理组为4,HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);1.2 具体中断的配置对于GPIO中断配置,可以使用HAL库中GPIO的初始化函数HAL_GPIO_Init,如下所示。/** * @brief Initialize the GPIOx peripheral according to the specified parameters in the GPIO_Init. * @param GPIOx: where x can be (A..H) to select the GPIO peripheral for STM32L4 family * @param GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains * the configuration information for the specified GPIO peripheral. * @retval None */ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)HAL_GPIO_Init函数中的第二个参数GPIO_Init对应的结构体GPIO_InitTypeDef,如下所示。typedef struct { uint32_t Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins */ uint32_t Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIO_mode */ uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. This parameter can be a value of @ref GPIO_pull */ uint32_t Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIO_speed */ uint32_t Alternate; /*!< Peripheral to be connected to the selected pins This parameter can be a value of @ref GPIOEx_Alternate_function_selection */ }GPIO_InitTypeDef;在这个结构体中的成员变量Mode就是用来这是GPIO的模式的。这里的GPIO模式包括了如下13种模式,其中的后面6种模式是用来设置中断相关的模式的。/** @defgroup GPIO_mode GPIO mode * @brief GPIO Configuration Mode * Elements values convention: 0xX0yz00YZ * - X : GPIO mode or EXTI Mode * - y : External IT or Event trigger detection * - z : IO configuration on External IT or Event * - Y : Output type (Push Pull or Open Drain) * - Z : IO Direction mode (Input, Output, Alternate or Analog) * @{ */ #define GPIO_MODE_INPUT (0x00000000u) /*!< Input Floating Mode */ #define GPIO_MODE_OUTPUT_PP (0x00000001u) /*!< Output Push Pull Mode */ #define GPIO_MODE_OUTPUT_OD (0x00000011u) /*!< Output Open Drain Mode */ #define GPIO_MODE_AF_PP (0x00000002u) /*!< Alternate Function Push Pull Mode */ #define GPIO_MODE_AF_OD (0x00000012u) /*!< Alternate Function Open Drain Mode */ #define GPIO_MODE_ANALOG (0x00000003u) /*!< Analog Mode */ #define GPIO_MODE_ANALOG_ADC_CONTROL (0x0000000Bu) /*!< Analog Mode for ADC conversion */ #define GPIO_MODE_IT_RISING (0x10110000u) /*!< External Interrupt Mode with Rising edge trigger detection */ #define GPIO_MODE_IT_FALLING (0x10210000u) /*!< External Interrupt Mode with Falling edge trigger detection */ #define GPIO_MODE_IT_RISING_FALLING (0x10310000u) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ #define GPIO_MODE_EVT_RISING (0x10120000u) /*!< External Event Mode with Rising edge trigger detection */ #define GPIO_MODE_EVT_FALLING (0x10220000u) /*!< External Event Mode with Falling edge trigger detection */ #define GPIO_MODE_EVT_RISING_FALLING (0x10320000u) /*!< External Event Mode with Rising/Falling edge trigger detection */ /** * @} */例如将PA0设置为中断模式,且上升沿触发,对应的代码如下GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; //设置模式为中断模式,且上升沿触发 GPIO_InitStructure.Pull = GPIO_NOPULL;GPIO_InitStructure.Pin = GPIO_PIN_0;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO的中断模式配置好之后,就可以被响应了。可以根据需要编写对应的中断响应函数。1.3 中断响应对应关系GPIO中断的响应的对应关系,如下图所示。有16条中断线跟GPIO按照上图的分组关系相关联。例如PA1~PE1引脚上的中断会被在EXTI1这条中断线上被响应。而对应的中断号及中断响应函数又有一些特别的分组对应关系。EXTI0~EXTI4,这5条中断线都有各自独立的中断号及中断响应函数,而EXTI5-EXTI9,这5个中断线共用一个中断号及中断响应函数,EXTI10-EXTI15这5个中断线共用一个中断号及中断响应函数。具体对应的中断号,可以在stm32l431xx.h中的IRQ_Type这个枚举定义中看到。这个枚举定义中,定义了所有中断的中断号,供编程使用。举简单的例子说明一下。如果PA0引脚上产生中断了,你需要在EXTI0对应的那个中断函数中做处理。如果PA3引脚上产生中断了,你需要在EXTI3对应的那个中断函数中做处理。如果PA5,PA6,PC5,PC6上产生了中断,你需要在EXTI5-9对应的那一个中断函数中进行处理。2. LiteOS系统应用GPIO中断2.1 硬件中断管理功能的配置要使用硬件中断,移植LiteOS的时候,需要在OS_CONFIG文件夹中的targetconfig.h文件中的如下代码段修改好配置。/*============================================================================= Hardware interrupt module configuration =============================================================================*/ /** * @ingroup los_config * Configuration item for hardware interrupt tailoring */ #define LOSCFG_PLATFORM_HWI YES /** * @ingroup los_config * Maximum number of used hardware interrupts, including Tick timer interrupts. */ #define LOSCFG_PLATFORM_HWI_LIMIT 96上面代码中的#define LOSCFG_PLATFORM_HWI 后面的 YES,是表示要使用硬件中断。如果不用是NO。#define LOSCFG_PLATFORM_HWI_LIMIT 后面数字的96, 目标硬件平台可有的最多硬件中断源数量,包括了时钟中断源。这个数值根据具体的目标硬件平台的中断源数量来确定。2.2 GPIO中断模式的配置在移植成功的LiteOS中,要使用GPIO的中断,就要在硬件初始化阶段对相关的引脚进行中断配置。配置的方法跟1.2具体中断配置中的方法相同。2.3 LiteOS中的中断函数编写在LiteOS中,可以自己定义个没有返回值、带参数或者不带参数的函数,作为某个中断响应的中断函数。如下IoT Link 模板工程中的os_interrupt_demo.c中的示例代码,如下tatic Key1_interrupt_entry() { printf("KEY1 Interrupt entry OK!,sum1:%d\r\n",sum1++); __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_2); }在自己定义的中断函数中,可以编写自己需要的处理程序代码。在编写自己的代码时候,时常要用到STM32相关的库函数。2.4 中断的注册调用LiteOS的osal_int_connect函数,将该中断及中断函数一起注册到LiteOS系统中。osal_int_connect函数在osal.c文件里面,代码如下int osal_int_connect(int intnum, int prio, int mode, fn_interrupt_handle callback, void *arg) { int ret = -1; if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->int_connect)) { ret = s_os_cb->ops->int_connect(intnum, prio, mode, callback, arg); } return ret; }其中,参数intnum 是要注册的中断号,这个中断号是STM32中每个中断元定义的中断号,在stm32l431xx.h中的IRQ_Type枚举类型中有具体的定义。例如在IRQ_Type枚举类型中,可以看到EXTI0中断线对应的中断号是6,用EXTI0_IRQn来表示,如下代码示例。EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */参数prio是这个中断的优先级。参数mode,在这函数中暂时还没有使用。可以设置为0。callback就是中断响应需要执行的中断函数的名称。在IoT Link 模板工程中,有如下的参考代码。#define KEY1_EXTI_IRQn EXTI2_IRQn osal_int_connect(KEY1_EXTI_IRQn, 2,0,Key1_IRQHandler,NULL);这句话意思是将中断函数Key1_IRQHandler这个中断函数与EXTI2_IRQn这个中断号关联起来。这样中断线EXTI2上有中断信号产生时,就会自动调用Key1_IRQHandler这个中断函数。3. GPIO中断检测及LCD显示的程序实例以小熊派开发板为硬件平台,使用PA11和PB12引脚来做中断检测实验。这两个引脚在小熊派开发板的P5端子排的10和9号,预留出来给用户自己使用的。通常用户可以在此基础上扩展自己的应用功能。使用IoT Link 中的使用参考模板os_interrupt_demo的模板工程建立实例工程。修改程序代码。程序的实现的主要功能是,记住中断检测的次数,并将次数显示在LCD屏幕上。修改GPIO初始化函数MX_GPIO_INIT,增加对PA11和PB12引脚的初始化配置。如下//配置PA11引脚为中断模式 GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //配置PB12引脚为中断模式 GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);修改os_interrupt_demo.c文件中的代码如下#include "lcd.h" uint32_t sum3; uint32_t UserKey1Number=0; uint32_t UserKey2Number=0; static int app_hello_world_entry() { while (1) { printf("Hello World! This is Bearpi!\r\n"); POINT_COLOR = RED; LCD_ShowNum(20, 90, UserKey1Number, 8, 24); LCD_ShowNum(20, 170, UserKey2Number, 8, 24); osal_task_sleep(50); } } //@brief 这函数处理EXTI10-15 的中断。 //PA11的中断连接到EXTI11 //PA12的中断连接到EXTI12,但是EXTI10~EXTI15 共用一个中断号,都在一个中断函数中处理 static UserKey1_Key2_entry() { int i=300000; //这三行代码目的是想做延时消抖用,暂时还没找到更好的在中断函数中用的延时函数。 while(i>0) i--; if(__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_11) != 0x00u) // PA11产生了中断信号 { UserKey1Number++; __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_11); } if(__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_12) != 0x00u) // PB12产生了中断信号 { UserKey2Number++; __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_12); } if(UserKey1Number >100 || UserKey2Number > 100 ) { UserKey1Number=0; UserKey2Number=0; sum3=0; } printf("UserKEY1_2 Interrupt entry OK!,sum3:%d,i:%d\r\n",sum3++,i); } int standard_app_demo_main() { LCD_Clear(WHITE); POINT_COLOR = BLUE; LCD_ShowString(20, 50, 240, 24, 24, "UserKey1Number is"); LCD_ShowString(20, 130, 240, 16, 24, "UserKey2Number is"); osal_task_create("helloworld",app_hello_world_entry,NULL,0x400,NULL,2); osal_int_connect( EXTI2_IRQn, 3, NULL, Key1_interrupt_entry, NULL); osal_int_connect( EXTI3_IRQn, 4, NULL, Key2_interrupt_entry, NULL); osal_int_connect( EXTI15_10_IRQn, 5, NULL, UserKey1_Key2_entry, NULL); return 0; }编译下载运行,运行效果图如下所示 在IoT Serial 的调试串口中可以看到如下信息4. 总结STM32的中断有些复杂,理解清楚中断相关的概念及应用方法,会帮助在LiteOS系统顺利的使用它的中断。LiteOS系统接管硬件时,要先在target_config.h中简单配置一下,就可以使用硬件中断了。GPIO中断在使用时,要先在GPIO初始化中配置上它的中断模式,然后编写相关的中断函数,最后在LiteOS中调用os_int_connect函数,配置中断优先级,关联中断的中断号与中断函数,这样系统就可以自动调用中断函数。这种应用,比在STM32裸机上应用中断要简单容易一些。中断的复杂性,导致应用和理解容易出现差错,如果内容如有问题欢迎大家提出讨论,分享,共同学习,共同进步。
-
基于STM32L431上,运行LiteOS,有时需要使用硬件中断。在LiteOS中硬件中断需要调用LOS_HwiCreate函数,如下所示代码/***************************************************************************** Function : LOS_HwiCreate Description : create hardware interrupt Input : uwHwiNum --- hwi num to create usHwiPrio --- priority of the hwi usMode --- unused pfnHandler --- hwi handler uwArg --- param of the hwi handler Output : None Return : OS_SUCCESS on success or error code on failure *****************************************************************************/ LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T uwHwiNum, HWI_PRIOR_T usHwiPrio, HWI_MODE_T usMode, HWI_PROC_FUNC pfnHandler, HWI_ARG_T uwArg ) { UINTPTR uvIntSave; if (NULL == pfnHandler) { return OS_ERRNO_HWI_PROC_FUNC_NULL; } /* SysTick_IRQn == (UINT32) -1 */ if ((uwHwiNum >= OS_HWI_MAX_NUM) && (uwHwiNum != (UINT32)SysTick_IRQn)) { return OS_ERRNO_HWI_NUM_INVALID; } //because unsigned interger could be less than zero,so if OS_HWI_PRIO_HIGHEST is zero,there //will be warning using usHwiPrio < OS_HWI_PRIO_HIGHEST // if ((usHwiPrio > OS_HWI_PRIO_LOWEST) || (usHwiPrio < OS_HWI_PRIO_HIGHEST)) --modified by zhangqf if (usHwiPrio > OS_HWI_PRIO_LOWEST) { return OS_ERRNO_HWI_PRIO_INVALID; } uvIntSave = LOS_IntLock(); m_pstHwiSlaveForm[uwHwiNum + VECTOR_IDX_OFFSET].pfnHandler = pfnHandler; #if (OS_HWI_WITH_ARG == YES) m_pstHwiSlaveForm[uwHwiNum + VECTOR_IDX_OFFSET].pParm = (VOID*)uwArg; #endif NVIC_EnableIRQ((IRQn_Type)uwHwiNum); NVIC_SetPriority((IRQn_Type)uwHwiNum, usHwiPrio); LOS_IntRestore(uvIntSave); return LOS_OK; }在这个函数的实现代码中,调用了NVIC_SetPriority这个宏定义进行了中断的优先级设定。我们知道STM32的中断优先级有两种,即抢占优先级 和 响应优先级。并且只用4个位来表示这两个优先级的数值。但是这里设置优先级时,只使用了一个参数usHwiPrio.那么这一个usHwiPrio如何对应两种优先级呢?举例说明如下。如果 usHwiPrio等于3(用二进制表示为 0011),且整个系统的中断优先级分组设定为3(即前三位表示抢占优先级,最后一位表示响应优先级。那么这个中断响应对应的抢占优先级为1,响应优先级为1.
-
长期更新……
-
STM32L431中每个GPIO引脚都可以配置中断功能,这个功能比较强大。但是对于理解和使用来说有点复杂。这里简单介绍一下外部中断的配置步骤。使能I/O时钟,初始化IO口作为输入。开启SYSCFG时钟,设置IO口与中断线的映射关系。初始化线上的中断,设置触发条件。配置中断优先级,使能中断。以PA0的外部中断配置为例, 可参考如下库函数。在HAL库函数中也可以找对对应的函数。123456789101112RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SYSCFG,ENABLE); //开启SYSCFG时钟SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //设置PA0与中断映射线的关系EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //初始化中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//配置中断优先级,使能中断在LiteOS中用外部中断时,可以按照上述步骤,检查一下模板工程中是否已经配置好了需要的外部中断。然后需要调用LiteOS的API挂接中断服务函数,这样才好处理中断响应。
-
这算是移植2.0版本吧,之前给大家写过一个关于stm32L476的LiteOS移植,当时还没有正式发布IoT Link Studio,有些操作在Ubuntu下完成的,这次就在Windows下做吧,大家可以根据这一系列连载,照葫芦画瓢,将LiteOS移植到各类不同的芯片上,不一定非要用STM32F103。一、移植前准备软件资源IoT Link Studio:VS code中搜索即可下载(MAC平台暂不支持)LiteOS SDK:https://github.com/LiteOS/LiteOS_Lab STM32CubeMX:ST官网可下载硬件资源 Stm32f103rc最小系统开发板二、SDK概述将SDK下载解压后会得到以下几个文件夹,先给大家介绍一下:FAQ:存放一些常见的问题doc:有关SDK的一些文档drivers/third_party:第三方库,例如ST公司的HAL库和LL库、GD公司的标准库等。iot_link:SDK中所有的组件都在这里面,包括LiteOS。targets:华为官方以及友商提供的移植好的工程文件,可以让我们参考test:一些测试脚本等。tools:一些工具,Kconfig等。 我们主要使用drivers/third_party、iot_link和targets三个目录中的文件,首先阅读targets目录中的某个与我们移植的目标平台接近的工程文件,学习其结构和阅读其Makefile,采用照葫芦画瓢的形式移植。三、移植目标与移植流程后面的移植会按照一下步骤进行,最终达到让内核运行的目标,可以任意加减组件并自制一个上报数据的Demo。① 学习其他工程的结构以及思考是如何移植出来的② 根据开发板原理图使用STM32CubeMX生成基于Makefile的初始化代码③ 调整工程中目录的结构④ 修改Makefile⑤ 修改链接脚本⑥ 编译排错,达到让LiteOS内核能运行的目标⑦ 添加用户逻辑部分,实现项目需求 四、与上次移植教程的差异之前是采用ubuntu进行配置和编译的,本次全程采用IoT Link Studio。之前是移植到STM32L476平台上,因为是基于STM32F431的工程移植的,可能大家感觉这两款平台都是M4内核、低功耗产品,之间的差异不大,本此就移植到M3内核的STM32F103,ST公司最经典的产品上。
-
【物联网知识竞赛】Huawei LiteOS的互联框架能够提供哪些完整的协议栈?
-
【物联网知识竞赛】Huawei LiteOS安全框架提供的终端安全有哪些
-
LiteOS给提供了多种内存动态匹配算法默认使用BestFit (最佳适应算法),其他算法还包括DLINK算法。为啥答案时AD。
-
LiteOS给提供了多种内存动态匹配算法默认使用BestFit (最佳适应算法),其他算法还包括DLINK算法。为啥答案时AD。 242068 很迷惑????LiteOS给提供了多种内存动态匹配算法默认使用BestFit (最佳适应算法),其他算法还包括DLINK算法。为啥答案时AD。
-
LiteOS给提供了多种内存动态匹配算法默认使用BestFit (最佳适应算法),其他算法还包括DLINK算法。为啥答案时AD。 242040 LiteOS给提供了多种内存动态匹配算法默认使用BestFit (最佳适应算法),其他算法还包括DLINK算法。为啥答案是AD
-
LiteOS给提供了多种内存动态匹配算法默认使用BestFit (最佳适应算法),其他算法还包括DLINK算法。为啥答案时AD。 242033
-
LiteOS有什么方法解决通常物联网开发遇到的开发语言编程效率低、上手难度大的问题?
-
LiteOS会增加插件让树莓派,Atlas200DK,等ARM开发板简单调用LiteOS的功能吗?
推荐直播
-
昇思MindSpore技术公开课·大模型专题(第二期)第十二课:Prompt Engineering
2024/03/31 周日 14:00-15:30
周汝霖 昇思MindSpore布道师
本期邀请到昇思MindSpore布道师、昇思十大优秀开发者周汝霖作客直播间,为大家讲解Prompt以及示例演示。Prompt Engineering(提示工程)可帮助用户将LLM(大语言模型)用于各研究领域和特定场景,从而更有助于我们了解和运用大模型,本期我们将学习这一新课题。
即将直播
热门标签