• [问题求助] 【趁热打“帖”】关于NB模块的eDRX平均功耗估算
    eDRX周期中分为两部分,PTW寻呼监听段和休眠段,我的理解,PTW寻呼监听段的电流应该与DRX模式接近,而休眠段的电流应该与PSM的接近。今天某个群友提供了几张电流测量图,BC95-B5-JB  +MCU一起 ,从图上看eDRX周期是20.48s,PTW是10.24s。可以看到休眠段的平均电流是9uA,考虑到MCU等外设的功耗,我觉得这符合接近PSM的预想。可以看到PWT段的平均电流是9mA,而整个eDRX周期的平均电流是4.6mA,这也符合50% duty的设置估算值(PTW 10.24s:eDRX 20.48s)。问题来了:考虑到一般NB模块规格书中,对idle电流的说明,大约是2~3mA(比如BC28,而BC95早期型号也标注为6mA),此时应该是100%寻呼监听的DRX?为何平均电流还比eDRX小呢?另外,关于PTW的大小,有个说法是不要小于10.24s(设置值最小可以是5.12s),否则容易漏掉接收,这是网络参数还能优化还是说NB的技术限制?。如此的话,要做到3mA的平均电流,eDRX的周期就要大于30.72s了,而我们用eDRX的目的,就是为了能比DRX极大降低电流,比如做到300uA,那就意味着eDRX周期需要加大到300s以上了,这对系统的响应时间挑战很大啊。
  • [热门活动] 【物联网竞赛巡回讲座-上海交大站】有奖提问,你的问题价值白金!
    欢迎大家来到全国物联网设计竞赛巡回演讲-上海交大站!也欢迎大家加入到我们华为云IoT平台论坛!双重欢迎,加倍奖励!回复主题,即可有机会获得智能手环。既能解答自己的疑惑,又能获得惊喜大奖,这,就是知识的力量╰(*°▽°*)╯。话不多说,请看规则:1.       在本帖下回复帖子,说出你对IoT的一切疑问;2.       IoT专家对所有回复的帖子进行筛选,挑选出6个获奖提问;3.       讲座结束前公布获奖者论坛昵称,现场领取奖品; 所有的问题都是有价值的问题!我们会在讲座结束后,安排专家一一回答大家所有的问题。
  • [热门活动] 【物联网竞赛巡回讲座-郑州大学站】有奖提问,你的问题价值白金!
    欢迎大家来到全国物联网设计竞赛巡回演讲-郑州大学站!也欢迎大家加入到我们华为云IoT平台论坛!双重欢迎,加倍奖励!回复主题,即可有机会获得智能手环。既能解答自己的疑惑,又能获得惊喜大奖,这,就是知识的力量╰(*°▽°*)╯。话不多说,请看规则:1.       在本帖下回复帖子,说出你对IoT的一切疑问;2.       IoT专家对所有回复的帖子进行筛选,挑选出6个获奖提问;3.       讲座结束前公布获奖者论坛昵称,现场领取奖品; 所有的问题都是有价值的问题!我们会在讲座结束后,安排专家一一回答大家所有的问题。
  • [技术干货] 4G工业无线路由器的性能、特点及工作原理
    4G工业级无线路由器是指利用4G LTE网络达到数据远程无线传输功能的工业级户外高速无线上网终端.4G路由器采用高性能的工业级处理器,内置嵌入式实时操作系统与4G模块通信,采用串口、以太网LAN、以太网WAN、Wi-Fi作为本地通讯方式,可同时连接串口设备、以太网设备和WIFI设备,实现数据透明传输和路由功能.4G工业级无线路由器分为:移动4G路由器、联通4G路由器、电信4G路由器、全网通4G路由器,通过内置的4G模块决定兼容的网络制式,一般向下兼容3G、2G,在4G信号不稳定的地区会自动切换.工业级应用的4G路由器一般比市面上民用级4G无线路由器要求更稳定,更能适应在恶劣气候环境下的连续工作,同时成本也更高。目前广泛应用于物联网产业链中的M2M行业,如智慧生活、智能电网、智能交通、工业自动化、智能建筑、公共安全、环境监测、智慧农业等领域。
  • [交流分享] Lierda NB-IoT产品线相关产品资料——All In One
    Lierda NB-IoT产品线相关产品资料如下:1. NB86-G系列模组相关——Lierda NB86-G系列模组相关资料NB86系列模块是基于HISILICON Hi2115的Boudica芯片开发的,该模块为全球领先的NB-IoT无线通信模块,符合3GPP标准, Hi2115芯片支持Band01, Band02, Band03,Band05、 Band08、 Band12, Band13, Band14, Band17, Band18, Band19, Band20、 Band25,Band26, Band28, Band66频段,具有体积小、功耗低、传输距离远、抗干扰能力强等特点。 2. Lierda NB86 EVK——Lierda NB86 EVK相关资料Open CPU实验课程——All In OneNB86 EVK设计基于NB86-G模组,同一模组支持全球多个运营商频段,集成3gpp Release 14协议,支持Cat NB2,同时可以提供其内部丰富的二次开发资源,用于终端客户将MCU的应用程序直接集成到模组内部,降低成本,减小尺寸,同时模组本身的FOTA升级功能将用户应用程序一同升级,为产品部署开发提供便利。 3.Lierda NB-IoT USB Dongle——Lierda NB-IoT USB Dongle相关资料Lierda NB-IoT USB Dongle是基于Lierda NB-IOT模组开发的测试工具Lierda NB-IoT USB Dongle定障手册  ( Update:20190813 ) 4.MB86系列模块相关——MB86系列模块相关资料MB86系列模块与NB86-G系列模块均是是基于HISILICON Hi2115的Boudica芯片开发的,差别在于模块的机械结构,较NB86系列尺寸大一点,兼容市场上另一款主流模块。 【Lierda】和你一起聊聊NB-IoT专题汇总:1、带RA功能的数据发送——带RA功能的数据发送2、Lierda NB模组状态转换及PSM模式配置 ——Lierda NB模组状态转换及PSM模式配置3、eDRX及DRX模式的北向控制可达性——关于eDRX及DRX模式的北向控制可达性4、关于基站信号覆盖质量里相关参数——关于基站信号覆盖质量里相关参数5、浅谈物联网应用中的电池问题——浅谈物联网应用中的电池问题6、小区重选和异频组网 ——小区重选和异频组网7、FOTA基本流程及注意事项——FOTA基本流程及注意事项8、openCPU方案实现数据上传OneNET平台——openCPU方案实现数据上传OneNET平台9、天线匹配灵敏度偏低,如何分析?——天线匹配灵敏度偏低,如何分析?10、NB模组对接OneNET平台——NB模组对接OneNET平台(一)——手动回复11、NB模组对接OneNET平台——NB模组对接OneNET平台(二)——预注册模式下自动回复12、NB模组对接OneNET平台——NB模组对接OneNET平台(三)——非预注册模式下自动回复13、NB-IoT模组复位问题——NB-IoT模组复位问题14、模组注册成功但长期挂测时电池没电——模组注册成功但长期挂测时电池没电15、NB模组搜索小区和注册方面问题——NB模组搜索小区和注册方面问题16、快速简单了解NB-IoT是什么——快速简单了解NB-IoT是什么17、OneNET FOTA基本流程和注意事项——OneNET FOTA基本流程和注意事项18、NB-IoT PSM模式相关问题——NB-IoT PSM模式相关问题19、OpenCPU 方案介绍——OpenCPU 方案介绍20、OpenCPU方案开发环境搭建——OpenCPU方案开发环境搭建21、信号强度RSRP间的比较盲区——信号强度RSRP间的比较盲区22、NB-IoT关键流程1—寻呼过程——NB-IoT关键流程1—寻呼过程23、串口波特率容限相关问题——串口波特率容限相关问题24:、OpenCPU方案开发OneLight示例——OpenCPU方案开发OneLight示例Lierda技术支持:nbiot_support@lierda.com
  • [交流分享] 【Lierda】Lierda NB86 EVK相关资料
    NB86 EVK设计基于NB86-G模组,同一模组支持全球多个运营商频段,集成3gpp Release 14协议,支持Cat NB2,同时可以提供其内部丰富的二次开发资源,用于终端客户将MCU的应用程序直接集成到模组内部,降低成本,减小尺寸,同时模组本身的FOTA升级功能将用户应用程序一同升级,为产品部署开发提供便利。NB86-EVK分为NB86-EVK-A板(A板)和NB86-EVK-B板(B板)。NB86-EVK-B板以MCU+NB模组的方案模拟水表、路灯等场景; NB86-EVK-A板以openCPU的方案模拟水表/路灯场景,程序在模组内开发,省掉外挂MCU。   技术文档:NB86-EVK硬件使用指导.pdf( 预览 )Lierda NBEVK测试终端固件烧写教程_V1.0.20180919.pdf( 预览 )NB86-EVK操作使用手册_V2.0.20190730.pdf( 预览 )原理图:NB86-EVK-SCH.rar相关工具:Toolsuit.rar示例代码:MCU-NB86-EVK_Firmware.rar烧写固件:MCU-NB86-EVK_Firmware.rar                  
  • [交流吐槽] 我看了朱老师的视频讲的很棒,我想问下有没有51单片机关于驱动NB 模块的学习例程?
  • [问题求助] 单片机软件复位会影响bc35吗
    单片机软件复位会影响bc35吗我这边单片机软件复位后bc35发消息就error了
  • [问题求助] ECL问题
    你好 我从网上查到: CE Level,即覆盖增强等级(Coverage Enhancement Level)。从0到2,CE Level共三个等级,分别对应可对抗144dB、154dB、164dB的信号衰减。基站与NB-IoT终端之间会根据其所在的CE Level来选择相对应的信息重发次数。 请问哪个等级是信号覆盖最好的   还有就是信息重发次数现在bc35内置这种处理机制吗 还是需要在单片机应用方面去做?  如果需要单片机做 有没有参考示例呢
  • [技术干货] 【深创客】跟我学NB-IoT之AT命令从入门到精通系列一:LiteOS及开发板入门
    总介绍NB476开发板是以STM32L476为主控,结合BC95-B5模块的低功耗窄带宽物联网开发板。除此之外,开发板还配备了丰富的外围模块,为了让开发者更快速的上手使用,这里将会连续更新一些列教程用以解释说明开发板适配的LiteOS例程。最终会在开发板上运行一个基于Liteos系统 ,使用BC95上报&接收的DEMO。一、本节教程目的实现小灯的闪烁实现以按键中断的方式切换小灯亮灭状态二、开发环境NB476开发板套件Keil&STM32CubeMX开发工具三、开发步骤(一)获取源码下载一份已经针对NB476开发板移植好的Liteos操作系统,源码下载。使用Keil打开./liteos/targets/STM32L476_NB476/MDK-ARM目录下的Huawei_LiteOS.uvprojx工程文件。如果你手里有自己的STM32开发板,可参考官方移植教程,尝试移植。(二)初始化要操作的硬件(关键步骤)1.引脚初始化(1)通过开发板原理图,得知小灯(USR_LED)使用的是PB2引脚,按键(SW_4)使用的是PC3引脚。(2)以上两个引脚功能的初始化,在main()->HardWare_Init()->MX_GPIO_Init();函数中。注意,初始化代码可通过STM32CubeMX工具自动生成,然后复制粘贴到LiteOS中进行使用,不用自己手动编写。(自动生成过程也需要占用一定的篇幅,可至文末下载或预览附件查看)。2.注册中断由于LiteOS操作系统并不接管硬件中断,所以,这里还需要注册SW_3按键所使用到的中断线,要注意的是,中断注册要放到内核初始化后,即LOS_KernelInit()后。 使用LOS_HwiCreate()函数进行中断注册,完整注册方式如下,LOS_HwiCreate(EXTI3_IRQn, 2,0,EXTI3_IRQHandler, NULL);代码如下int main(void) {     UINT32 uwRet = LOS_OK;     //引脚功能初始化     HardWare_Init();     uwRet = LOS_KernelInit();     if (uwRet != LOS_OK)     {         return LOS_NOK;     }     //对以下任务中要用到的中断号进行注册     LOS_HwiCreate(EXTI3_IRQn, 2,0,EXTI3_IRQHandler, NULL);     //任务注册     //...     LOS_Start(); } 3.创建任务在注册完中断后,创建一个任务用于执行小灯闪烁。例如:int main(void) {     UINT32 uwRet = LOS_OK;     //引脚功能初始化     HardWare_Init();     uwRet = LOS_KernelInit();     if (uwRet != LOS_OK)     {         return LOS_NOK;     }     //对以下任务中要用到的中断号进行注册     LOS_HwiCreate(EXTI3_IRQn, 2,0,EXTI3_IRQHandler, NULL);     //任务注册     uwRet = LOS_LEDExampleEntry();//小灯闪烁任务     if (uwRet != LOS_OK)     {         return LOS_NOK;     }     LOS_Start(); } UINT32 LOS_LEDExampleEntry(void)//小灯闪烁任务 {     UINT32 uwRet;     TSK_INIT_PARAM_S stTaskInitParam;     (VOID)memset((void *)(&stTaskInitParam), 0, sizeof(TSK_INIT_PARAM_S));     stTaskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)LOS_LEDExampleTskfunc;//入口函数     stTaskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE;     stTaskInitParam.pcName = "LEDDemo";     stTaskInitParam.usTaskPrio = 10;     uwRet = LOS_TaskCreate(&g_uwledTaskID, &stTaskInitParam);     if (uwRet != LOS_OK)     {         return LOS_NOK;     }     return LOS_OK; }其中LOS_LEDExampleTskfunc为任务的入口函数。(更多Liteos基础范例与介绍可参考基础范例与介绍)在入口函数中实现小灯的闪烁。代码如下//小灯闪烁 VOID LOS_LEDExampleTskfunc(VOID) { while (1) { LOS_LED_ON(); LOS_TaskDelay(1000); LOS_LED_OFF(); LOS_TaskDelay(1000); } }4.重载中断回调函数 在stm32l4xx_it.c中重载GPIO的中断回调函数。当按键中断被触发时,CPU会自动执行如下代码void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//GPIO中断回调函数 { if(GPIO_Pin == SW4_Pin)//按键中断 { LOS_LED_Toggle();//USR_LED状态切换 } }(三)编译与烧录1.编译,如图  2.使用STLINK与NB476相连SWDIO接SWDIO,SWCLK接SWCLK,GND接GND,如图3.点击下载,如图四、最终效果USR_LED一秒闪烁一次,且可以通过SW4按键切换小灯亮灭状态 下一篇:【深创客】跟我学NB-IoT之AT命令从入门到精通系列二:传感器数据采集与显示代码生成例程操作指导简单代码生成例程.pdf( 预览 )
  • [技术干货] 串口小知识总结
    一、串口是常用的设备通信协议,串口按照位(bit)发送和接收字节。串口通信时,收发是一个周期一个周期进行的,每周期传输n个二进制位。这一个周期就叫做一个通信单元,一个通信单元是由:起始位+数据位+奇偶校验位+1停止位  组成的。1、起始位表示发送方要开始一个通信单元:数据位是一个通信单元中发送的有效信息位;奇偶校验位是用来校验数据位,以防止数据位出错的;停止位是发送方用来表示本通信单元结束标志的。2、起始位的定义是串口通信标准事先指定的,是由通信线上的电平变化来反映的。3、数据位是本次通信真正要发送的有效数据,串口通信一次发送多少位有效数据是可以设定的(一般可选的有6、7、8、9,99%情况下我们都是选择8位数据位。因为我们一般通过串口发送的文字信息都是ASCII码编码的,而ASCII码中一个字符刚好编码为8位。)4、奇偶校验位是用来给数据位进行奇偶校验(把待校验的有限数据逐个位的加起来,总和为奇数奇偶校验位就为1,总和为偶数奇偶校验位就为0)的,可以在一定程度上防止位反转。可以用来判断是否存在噪音干扰数据传输,以及是否有不同步。5、停止位的定义是串口通信标准事先指定的,是由通信线上的电平变化来反映的。常见的有1位停止位,1.5位停止位,2位停止位等。99%情况下都是用1位停止位。6、波特率:指数据信号对载波的调制速率。2400bit表示每秒发送2400bit,和距离成反比。7、数据流控制:台式机和单片机之间的通信,如果缓冲区慢了,继续接收数据,会造成数据丢失。分为软件流控制和硬件流控制,比如硬件流控制就是如果接收端准备好接收数据,CTS为1,否则为0.发送端准备好发送,RST为1,否则为0.二、串口可以使用一根线发送数据的同时,用一根线接收,其他线用来握手,但是非必须。我们在串口和SoftRadio之间传输数据就需要遵守串口通信协议,串口通信时因为是异步通信,所以通信双方必须事先约定好通信参数,这些通信参数包括:波特率、数据位、奇偶校验位、停止位(串口通信中起始位定义是唯一的,所以一般不用选择)。
  • [技术干货] Huawei_LiteOS的启动文件与sct文件分析
    软件环境:Keil 51.  裸机启动文件与sct文件分析关于stm32裸机启动文件的简单分析可参考:STM32学习笔记(6):启动代码(启动代码)总结来说:定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K。定义HEAP段,{NOINIT,读写}:分配一段内存大小为1K。定义RESET段,{DATA,只读}:DCD各种中断向量。定义|.text |段,{CODE,只读}:Reset_Handler函数,函数中最后加载了__main;对剩余的中断函数进行了弱定义;在最后还有一段用户初始化堆栈的代码__user_initial_stackheap。那这些代码都存放在什么位置呢?看一下.sct文件:LR_IROM1 0x08000000 0x00080000  {    ; load region size_region   ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address    *.o (RESET, +First)    *(InRoot$$Sections)    .ANY (+RO)   }   RW_IRAM1 0x20000000 0x00010000  {  ; RW data    .ANY (+RW +ZI)   } }STACK段和HEAP段是RW属性,存在RAM(0x20000000-0x20010000)中,具体的地址由编译器在后面链接时决定,并不是一定存在RAM的开头地址(本人刚开始理解的误区)。RESET段存在FLASH(0x08000000-0x08080000)中,而且是FLASH的最开头。再结合CORTEX-M3的特性,其上电后根据启动引脚来决定PC位置,比如启动设置为FLASH启动,则启动后PC跳到0x08000000。此时CPU会先取2个地址(硬件决定),第一个是栈顶地址,第二个是复位异常地址,这样就跳到Reset_Handler,Reset_Handler执行到将最后跳转到C库的__main。|.text|段是CODE属性,也存在FLASH区。启动代码所做的工作如下图所示:先是建立了堆栈,之后上电后寻找到中断向量表中的复位函数reset_handler执行,之后跳转到__main执行C库函数,最后由__main调用main()函数,进入C的世界。__main的主要作用以及和我们自己写的main()函数的区别,可以参考:ARM启动代码中_main与用户主程序的main()中的区别2.  __user_initial_stackheap分析一波__user_initial_stackheap,这段代码位于裸机启动文件的末尾:                 IF      :DEF:__MICROLIB                                  EXPORT  __initial_sp                  EXPORT  __heap_base                  EXPORT  __heap_limit                                   ELSE                                 IMPORT  __use_two_region_memory                  EXPORT  __user_initial_stackheap                  __user_initial_stackheap                  LDR     R0, =  Heap_Mem                  LDR     R1, =(Stack_Mem + Stack_Size)                  LDR     R2, = (Heap_Mem +  Heap_Size)                  LDR     R3, = Stack_Mem                  BX      LR若是使用了microlib,则只需要将__initial_sp,__heap_base,__heap_limit三个变量定义成全局变量即可(这三个变量也是固定的可被C库引用,在库中需要使用到这三个变量对堆栈进行初始化);否则,就需要自己定义__user_initial_stackheap。microlib缺省的情况下使用的是Keil C库。但是事实上,µVision 库里包含了更多__user_initial_stackheap()的函数体,这样编译器可以根据开发人员scatter文件的内容自动选择合适的函数体。换句话说,针对RVCT v3.x及之后的版本,使用scatter文件的开发人员可以不再重新实现__user_initial_stackheap()的函数体。(参考:__user_initial_stackheap() 上班偷懒翻译的KEIL说明书里的)也就是说不必再自己写了__user_initial_stackheap,自己在做实验验证时,没有使用microlib库,同时也将这部分函数注释掉,并没有产生任何异常。所以对__user_initial_stackheap在这里就不再做更多深入的研究了,这一部分太烧脑了,就当作C库已经为我们准备好了这个函数。3.  堆栈的单区模型和双区模型堆栈分为单区模型和双区模型:单区模型堆和栈在同一存储器区中互相朝向对方增长双区模型将堆和栈分别放置在存储器不同的区中,__user_initial_stackheap() 建立的专用堆限制来检查堆,需要设置堆栈的长度。选择使用单区模型,在sct文件中定义一个特殊的执行域,使用符号:ARM_LIB_STACKHEAP,并使用EMPTY属性。这样库管理器就选择了一个把这个域当作堆和栈合并在一起的__user_initial_stackheap()函数。在这个函数中使用了"Image$$ARM_LIB_STACKHEAP$$Base"和"Image$$ARM_LIB_STACKHEAP$$ZI$ $Limit"符号 。选择使用双区模型,在sct文件中定义两个特殊的执行域,使用符号:ARM_LIB_STACK和ARM_LIB_HEAP,都要使用EMPTY属性。这样库管理器就会选择使用符号:"Image$$ARM_LIB_HEAP$$Base","Image$$ARM_LIB_STACK$$ZI$$limit"、"Image$$ARM_LIB_STACK$$Base"、"Image$$ARM_LIB_STACK$$ZI$$Limit"的__user_initial_stackheap()函数。从裸机的启动文件可以看出,裸机使用的是双区模型,那么问题来了:为啥裸机的.sct文件没有ARM_LIB_STACK和ARM_LIB_HEAP这两个加载域呢?我猜呢,ARM_LIB_STACK和ARM_LIB_HEAP需要跟带$的那四个符号配套使用,但启动文件里没使用带$的那四个符号,没有赋值,而是直接将__initial_sp,__heap_base,__heap_limit这三个变量提供给C库使用。我是这么理解的,有没有屌大的来反驳我一下。4.  Huawei_LiteOS启动文件与sct文件首先启动文件:LOS_Heap_Min_Size   EQU     0x400                 AREA    LOS_HEAP, NOINIT, READWRITE, ALIGN=3 __los_heap_base LOS_Heap_Mem    SPACE   LOS_Heap_Min_Size                 AREA    LOS_HEAP_INFO, DATA, READONLY, ALIGN=2                 IMPORT  |Image$$ARM_LIB_STACKHEAP$$ZI$$Base|                 EXPORT  __LOS_HEAP_ADDR_START__                 EXPORT  __LOS_HEAP_ADDR_END__ __LOS_HEAP_ADDR_START__                 DCD     __los_heap_base __LOS_HEAP_ADDR_END__                 DCD     |Image$$ARM_LIB_STACKHEAP$$ZI$$Base| - 1                 PRESERVE8                 AREA    RESET, CODE, READONLY                 THUMB                 IMPORT  ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||                 IMPORT  osPendSV                 EXPORT  _BootVectors                 EXPORT  Reset_Handler _BootVectors                 DCD     ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||                 DCD     Reset_Handler Reset_Handler                 IMPORT  SystemInit                 IMPORT  __main                 LDR     R0, =SystemInit                 BLX     R0                 LDR     R0, =__main                 BX      R0                 ALIGN                 END定义LOS_HEAP段,{NOINIT,读写}:分配一段内存大小为1K。定义LOS_HEAP_INFO段,{DATA,只读}:定义__LOS_HEAP_ADDR_START__和__LOS_HEAP_ADDR_END__这两个全局变量供OS使用。定义RESET段,{CODE,只读}:启动向量,第一个是栈顶地址,第二个是Reset_Handler;将Reset_Handler主体也写入了RESET段。首先,可以看出,分配堆栈的方式与裸机不同,使用的是单区模型,从下向上排列:__LOS_HEAP_ADDR_START__=__los_heap_base,为堆低地址;__LOS_HEAP_ADDR_END__=|Image$ $ARM_LIB_STACKHEAP$$ZI$ $Base| - 1,为堆顶(不确定的地址);|Image$ $ARM_LIB_STACKHEAP$ $ZI$ $Base|,为栈底(不确定的地址);|Image$ $ARM_LIB_STACKHEAP$ $ZI$ $Limit|,为栈顶地址;所以,由上文可知,在sct文件中必然会出现ARM_LIB_STACKHEAP这个执行域:LR_IROM1 0x08000000 0x00020000  {    ; load region size_region     ER_IROM1 0x08000000 0x00020000  {    ; load address = execution address         *.o (RESET, +First)         *(InRoot$$Sections)         .ANY (+RO)         * (LOS_HEAP_INFO)     }     VECTOR 0x20000000 0x400  {    ; Vector         * (.data.vector)     }     RW_IRAM1 0x20000400 0x00004800  {    ; RW data         ;.ANY (+RW +ZI)         * (.data, .bss)         * (LOS_HEAP)     }     ARM_LIB_STACKHEAP 0x20004C00 EMPTY 0x400  {    ;LiteOS MSP     } }那么其他的异常中断向量入口在哪里呢?定义在los_hwi.c文件中被定义成了数组的形式:#ifdef __ICCARM__ #pragma  location = ".data.vector" #elif defined (__CC_ARM) || defined (__GNUC__)LITE_OS_SEC_VEC #endifHWI_PROC_FUNC m_pstHwiForm[OS_VECTOR_CNT] = {     (HWI_PROC_FUNC)0,                    // [0] Top of Stack     (HWI_PROC_FUNC)Reset_Handler,        // [1] reset     (HWI_PROC_FUNC)osHwiDefaultHandler,  // [2] NMI Handler     (HWI_PROC_FUNC)osHwiDefaultHandler,  // [3] Hard Fault Handler     (HWI_PROC_FUNC)osHwiDefaultHandler,  // [4] MPU Fault Handler     (HWI_PROC_FUNC)osHwiDefaultHandler,  // [5] Bus Fault Handler     (HWI_PROC_FUNC)osHwiDefaultHandler,  // [6] Usage Fault Handler     (HWI_PROC_FUNC)0,                    // [7] Reserved     (HWI_PROC_FUNC)0,                    // [8] Reserved     (HWI_PROC_FUNC)0,                    // [9] Reserved     (HWI_PROC_FUNC)0,                    // [10] Reserved     (HWI_PROC_FUNC)osHwiDefaultHandler,  // [11] SVCall Handler     (HWI_PROC_FUNC)osHwiDefaultHandler,  // [12] Debug Monitor Handler     (HWI_PROC_FUNC)0,                    // [13] Reserved     (HWI_PROC_FUNC)osPendSV,             // [14] PendSV Handler     (HWI_PROC_FUNC)osHwiDefaultHandler,  // [15] SysTick Handler};这一部分代码被分散加载文件加载到了VECTOR段,位于RAM的开头部分。至于中断是怎么实现的我还的在看几天安利一下自己的博客:https://blog.csdn.net/sinat_27066063
  • [技术干货] 【Mike教你物联网开发】LiteOS+NB模组连接OC平台——骐俊ML2510 NB模组
    骐俊ML2510 NB模组内置了COAP,LWM2M协议。与BC95类似,ML2510针对华为OC平台有一套AT指令,可以方便地与OC平台进行对接。 对接OC主要有三个步骤:  首先在los_nb_init函数中初始化NB模组。中间涉及的AT指令主要有:AT+NRB,AT+CFUN,AT+CGATT, AT+CSQ以及AT+NCDP。需要注意的是,在执行命令AT+NCDP之前,必须先在OC平台注册设备,且设备编号必须设置为设备的IMEI码。 然后通过函数los_nb_notify注册数据处理函数。程序就是在函数nb_cmd_data_ioctl中处理云平台下发的命令。“+NNMI”是模组接收到数据后生成的前缀(前提是设置AT+NNMI=1):  经过注册后,若数据帧前缀为”+NNMI”,则可以确定该条数据是云平台下发的命令。云平台命令处理的一般流程是:云平台下发命令,模组收到命令后通过串口向MCU发送字符串”+NNMI:<length>,<data>”。此时会触发串口中断,进入中断响应函数: 可以看到,中断响应函数中将串口数据存入结构体at的recv_buf成员中,完成后释放信号量recv_sem。释放该信号量会唤醒任务at_recv_task:该任务在等待信号量recv_sem,因此在串口中断响应函数执行完后会被唤醒。在函数cloud_cmd_matching()中,会判断los_nb_notify中设置的“+NNMI”是否是接收到字符串的子串。若是,则说明该数据是平台下发命令,调用命令处理函数nb_cmd_data_ioctl,进行相应的操作。 最后是数据上报,通过函数los_nb_report完成。需要注意,上报数据的格式必须与云平台profile中所定义的格式一致,否则会出现上报数据全部无法识别的错误。比如,制作profile时将数据定义为长度为5的定长字符串,若需要上报数据”234”,则需要将数据长度用空格补到5,变为“  234”。
  • [热门活动] 【云端大事件】中消云(北京)物联网科技研究院有限公司入驻华为云市场
    【导语】2018年8月10日,中消云(北京)物联网科技研究院有限公司入驻华为云市场,在华为云市场发布了独立式光电感烟火灾探测报警器,NB烟感通过NB-IOT接入中消云平台,实时监测所在场所的火警信息,并将报警信息通过电话语音、短信、APP三种通知方式推送至用户手机端,设备易安装、组网方式简捷; 让我们继续往下看一起来了解一下。【产品简介】TX3190-NB烟感是一款能够实时监测现场火警状态、并及时通知报警火情的火灾防控智能产品;支持NB-IOT、支持手机APP绑定、浓烟预警、高温预警、温度监测、智能阈值、电量提醒等报警功能。采用华为海思Hi2110芯片,模组选用lierda NB05-01模块。传感探测范围0.08-0.25dB/m,自动上传传感器数据,当报警触发时,蜂鸣器会响起(支持远程消音及本地消音),并伴以LED灯闪烁,同时报警信息将推送到云端平台,适用于业主用户、城市管理、物业管理、消防监控中心等多种业务场景,为消防安全预警提供一份保障。【详细参数】品牌:泰和安封装类型:礼盒装、工程装尺寸:直径100.3 mm 高46.8mm频段:B5(850MHz)重量:约 113g(包括电池)模组方案:华为海思BoudicaV120方案驱动:接收灵敏度:-129dBm功率等级:23dBm(MAX)传输速率:100bps-100kbps(TBD)网络协议:3GPP Rel.13 NB-IoT air interfaces and protocols湿度:相对湿度≤95%RH,不凝露温度范围:负10~55摄氏度接口:固件远程升级工作电压:DC3.6V (1 节锂电池)工作电流:监视电流:< 40uA;报警电流:< 100mA报警声响:大于 80dB心跳机制:20小时一次心跳【产品截图】产品正面产品背面内部组件【应用场景】九小场所、家庭住宅、商业建筑、旅馆、学校、网吧等【产品亮点】冲突避让 休眠唤醒,超低功耗支持多种协议栈: UDP /COAP;串口固件升级。【能力调用】【客户案例】案例名称1:中英街三小场所整体项目(烟感、网关)案例介绍:中英街商铺林立,日进出居民、游客近万人,大部分商铺货物存放杂乱,存在着很大安全隐患,为避免火灾发生,我公司提供了一套完整的消防云服务解决方案,覆盖200多家商铺,用户可通过网页和手机APP实时掌控消防设备信息,通过云平台集中管理,接收远程报警信息等,有效解决以往安装成本高、人外出后无法同时掌控灾情实况的问题。 案例名称2:华夏幸福项目(烟感)案例介绍:华夏幸福物业在廊坊市区包含35个住宅小区,覆盖面积广,加大了消防管控难度。使用我公司的消防云服务平台,在廊坊市区35个项目的消防监控中心布置物联网网关等设备,采集信息,接收实时数据,通过以太网上传至云平台,负责人通过PC端和客户端实时查看消防设备、设施状态,实时接收火警故障等信息,实现集中管理,减少因延误报警所造成的损失,随时掌握各单位消防系统动态,及时发现故障,予以维护服务,提高消防管理水平。 案例名称3:天津农商银行项目(烟感、网关)案例介绍:天津市区内分布了近300家农商银行营业网点,银行作为维护国民经济正常运转的重要部门,其消防安全非常重要。我公司提供的消防云服务平台,在天津市区内近300家农商银行营业网点投入大量消防设备,采集信息,接收实时数据上传至云平台,负责人通过PC端和手机app实时掌控消防设施信息,发现故障及时处理,集中化管理,提高银行消防安全水平。
  • PHP7的那些新特性,有没有关注的?
    本帖最后由 码小玩 于 2017-9-28 15:49 编辑PHP7于2015年11月正式发布,本次更新可谓是PHP的重要里程碑,它将带来显著的性能改进和新特性,并对之前版本的一些特性进行改进。本文将和大家一起来了解探讨PHP7中的新特性。 1. 标量类型声明我们知道PHP是一种弱类型的编程语言,因此没有提供任何方法来指定输入参数和返回值的类型,PHP7突破了这种现状,增加了对标量类型(int,float,string,bool)的声明支持,增加declare(strict_types=1)指令声明是否严格类型校验,我们来看一段代码:有效的类型有:class/interfacename, self, array, callable, bool, float, int and string. 2.?? ——NULL 合并运算符PHP7中添加了NULL合并运算符,不要小看这个“??”,有了它我们就能很方便的获取一个参数,并能在其为空的情况下提供一个默认值。如何??运算符左侧值存在并且不为NULL,则返回左侧,否则将返回其右侧值。 3. 匿名类匿名类顾名思义没有类名称,其声明和实例化是同时的,PHP7 支持通过 new class 来实例化一个匿名类,可以用来替代一些”用后即焚”的完整类定义。 4. 更多 Error 错误可以进行异常处理PHP7中更多的Error变为可捕获的Exception返回给开发者,如果不进行捕获则为Error,如果捕获就变为一个可在程序内处理的Exception。默认情况下,Error会直接导致程序中断,而PHP7则通过try / catch程序块捕获并且处理,让程序继续执行下去,为程序员提供更灵活的选择。 5. 结合比较运算符(=> )这个不多解释,我们直接看示例代码,通过代码你可以很容易了解该运算符的作用。 6. 定义数组常量过去我们在用define()定义常量时,数据类型只支持标量,但在PHP7中,支持定义数组类型的常量。PHP7新增的特性还有很多,今天我们先介绍到这,后续会持续更新,同时也欢迎广大PHPer补充,我们共同交流,共同学习,共同进步。 来源:程序师