当前位置: 首页 > news >正文

深圳最火的网站互联网行业发展现状

深圳最火的网站,互联网行业发展现状,软件开发公司名字大全,雁塔免费做网站Keil新版本出来了#xff0c;推出了一种全新开发模式RTE框架( Run-Time Environment)#xff0c;更好用了。然而网上的教程资料竟还都是把Keil5当成Keil4来用#xff0c;直接不使用这个功能。当前正点原子或野火的教程提供的例程虽有提到Keil5#xff0c;但也是基本上当Kei… Keil新版本出来了推出了一种全新开发模式RTE框架( Run-Time Environment)更好用了。然而网上的教程资料竟还都是把Keil5当成Keil4来用直接不使用这个功能。当前正点原子或野火的教程提供的例程虽有提到Keil5但也是基本上当Keil4来用还是传统的模式或标准库或HAL库。当然这用来学习挺好但是如果用来开发建议还是使用下Keil5的RTE框架。 现在的单片机开发早已经变天早已不是十年前刀耕火种的样子开发和使用越来越友好了。单片机的开发趋势越来越接近于软件层开发底层驱动的封装变成了芯片厂家做的工作。这是一种趋势对于开发使用人员而言可以更专注于需求和效率。 RTE框架直接给你提供了现成的板级驱动包和可视化模块配置你需要做的只是配置和在驱动层之上开发应用就行了。且包含了包管理功能包和组件使用和升级更方便了这是一大特色其他厂家都可以贡献和提供驱动包其他三方都可以提供模块组件开放共建。包括嵌入式内核你都不要移植且可以切换想用哪个用哪个不得不佩服老外IDE做的是真用心啊。 希望国产IDE软件也多学习学习老外如果国产软件也能这么强大好用该多好那时候国产芯片想不火都难。STM32的火是有原因的因为它的操作使用上比起其他单片机都简单。这得益于ST这家公司的睿智先是提供标准库后HAL库如今ST推出的STM32CubeMX配置软件就是想让你更简单更好用易用性上甩其他厂家几条街就是让你只用它家的就行了以此来笼络你垄断你但它只能耕stm32这一亩三分地。 在单片机领域基于Arm Cortex M内核的产品已经占据很大的一部分份额比较知名的ST的STM32系列NXP的LPC系列都是其中非常棒的产品。各个厂家为了用户能更好的使用这些单片机产品都推出了各自的软件工具和SDK以便帮助用户简单快速的开发软件。Arm公司为了防止Arm软件开发的碎片化提出并实施了CMSIS这个是Arm公司与多家不同的芯片和软件供应商一起紧密合作定义的提供了内核与外设、实时操作系统和中间设备之间的通用接口。后续用户需要做的仅是在应用层上做开发就可以了。 CMSIS的整体架构 前言 曾记得十年前使用STM32时那叫一个麻烦参考正点原子和野火的教程学习直接操作寄存器。 其实这也没啥毕竟这是传统的单片机的开发方式。如之前的51,avr,pic,msp430我想这几款单片机都玩过的肯定都是古董玩家想当年这几款单片机没少折腾我当然都是对着手册操作寄存器也没啥难的就是很低效换一种单片机就得先熟悉它的风格。 现在单片机开发变简单了许多这归功于stm32做的不错。之所以stm32它一直很火是因为它开创了一个先河j降低了单片机的门槛让单片机操作越来越简单了。ST官方最先推出了标准库然而依旧觉得不是很简单。再后来ST官方又推出了HAL库接着STM32CubeMX配置软件的横空出世让STM32可视化配置硬件参数和寄存器变更好用了。但STM32CubeMX仅用在ST的产品上深度绑定。 这里要介绍下Keil5的全新的开发方式RTE框架的使用。 可视化的最新的keil5软件真强大但网上提供的教程大多是基于传统keil4的开发模式有的虽然标题提到了RTE这种全新的包管理模式但是还是混杂着标准库或HAL库的概念让人混淆不清还在教你如何手工添加库和文件没体现RTE的好处和使用。 其实RET这种模式下就不要提什么标准库或HAL库了就当是各个厂家提供好了现成的板级驱动就好。你需要在做些配置且在驱动层之上开发应用。驱动层之下不用你过多关注驱动层和常用模块都已提供好了。这是未来的一种趋势因此建议尝试和使用下Keil5的RTE开发模式。 我通过查阅官网拿到第一手资料在此整理下我的总结分享给大家。后续再看到应用层直接操作寄存器和板级接口操作的不要再这样混着用啦这种非RTE框架模式的本意。 不知你有没有觉察到Keil5引入的这一开发理念很先进。会成为今后的主流趋势值得我们学习借鉴。以后软件开发者可以把精力放在快速的开发应用和创新上驱动操作封装成了芯片厂家要做的事。当多数国人还在卷单片机寄存器操作的时候老外又一次走在了前列。Keil5不愧是王者IDE好用易用性上排第一。以后不但芯片硬件上可替换软件应用层也可以做到很少改动。 以下是我的分享希望对大家有所帮助。另外本文中如果有需改善的地方欢迎留言谢谢 什么是RTE? Keil5 最新的 RTE 框架是一种用于配置嵌入式软件应用程序的软件组件。它提供了图形用户界面 (GUI)使开发人员可以轻松配置系统组件如处理器外设、通信接口和内存管理而不需要手动编写代码。相比原来使用的标准库或 HAL 库的方式Keil5 RTE 框架的优点在于它简化了开发流程提供了一种简单直观的配置方法并减少了必须手动编写的代码数量可以节省时间并减少错误。 软件组件介绍 MDK 提供软件组件Software Components用于使用称为运行时环境(RTE) 的框架创建应用程序。这些组件以独立于 µVision 安装的软件包形式提供。软件包由 Arm 或第三方提供。 Software Components 图为Arm Keil提供的软件包结构清晰。软件包可以包含设备支持包括驱动程序、CMSIS 库和中间件组件。其中的设备系列包,由各个芯片厂家提供。 设备系列包 (DFP)包含用于微控制器设备系列的 CMSIS 系统/启动、驱动程序和闪存算法。 CMSIS包含通用 CMSIS 组件CORE、DSP 和 NN 库以及 RTOS 实现。 MDK-Middleware包含属于 MDK-Professional 一部分的中间件库。 在项目中使用软件组件 1.使用Pack Installer安装或更新包含预构建软件组件的软件包。 2.使用窗口Manage Run-Time Environment将软件组件添加到项目中。添加的组件显示在“项目”窗口中。 3.可选设置组件的选项以指定属性。 4.可选为特定目标选择软件包。 新项目结构介绍 不要再用以往传统的手动创建所有目录再引入HAL库的落后方式了。当然可以在创建一些应用层的目录。其他层的按照配置出来的已经很清晰了。以下举例介绍下最的项目结构。 以上目录中默认配置生成的是绿色显示的。Device就相当于底层驱动层驱动层里面小写字母开头的文件是各个厂家官方提供的固件操作功能。大写字母开头的就是驱动接口及实现。在应用层使用时最好严格分层不要混合调用固件接口或操作寄存器了而是应通过大写字母开头的驱动接口去配置和调用。(注截图部分的代码仅为示例。它不好的地方是里面掺杂使用了如GPIOD-BSRR这种寄存器操作后文有正解。) CMSIS是一个标准以上CMSIS里的是标准驱动的实现其中的串口驱动和操作系统内核放置在里面。那个Board Support算是个模块儿化组件提供了一些通用的硬件模块操作如以上的是个跟板子硬件相关的LED灯的操作实现可以拿来复用不过需要根据板子的实际管脚分配来配置。 应用层使用介绍 Board Support这个文件夹虽然是配置出来的但是它实际就是一个应用层功能实现。可以用来学习看下它是如何使用GPIO接口驱动了。那么后续你的使用基本跟它类似。它的文件内容如下 #include Board_LED.h #include GPIO_STM32F10x.hconst GPIO_PIN_ID Pin_LED[] {{ GPIOE, 8 },{ GPIOE, 9 },{ GPIOE, 10 },{ GPIOE, 11 },{ GPIOE, 12 },{ GPIOE, 13 },{ GPIOE, 14 },{ GPIOE, 15 }, };#define LED_COUNT (sizeof(Pin_LED)/sizeof(GPIO_PIN_ID))/**\fn int32_t LED_Initialize (void)\brief Initialize LEDs\returns- \b 0: function succeeded- \b -1: function failed */ int32_t LED_Initialize (void) {uint32_t n;/* Configure pins: Push-pull Output Mode (50 MHz) with Pull-down resistors */for (n 0; n LED_COUNT; n) {GPIO_PortClock (Pin_LED[n].port, true);GPIO_PinWrite (Pin_LED[n].port, Pin_LED[n].num, 0);GPIO_PinConfigure(Pin_LED[n].port, Pin_LED[n].num,GPIO_OUT_PUSH_PULL,GPIO_MODE_OUT2MHZ);}return 0; }/**\fn int32_t LED_Uninitialize (void)\brief De-initialize LEDs\returns- \b 0: function succeeded- \b -1: function failed */ int32_t LED_Uninitialize (void) {uint32_t n;/* Configure pins: Input mode, without Pull-up/down resistors */for (n 0; n LED_COUNT; n) {GPIO_PinConfigure(Pin_LED[n].port, Pin_LED[n].num,GPIO_IN_FLOATING,GPIO_MODE_INPUT);}return 0; }/**\fn int32_t LED_On (uint32_t num)\brief Turn on requested LED\param[in] num LED number\returns- \b 0: function succeeded- \b -1: function failed */ int32_t LED_On (uint32_t num) {int32_t retCode 0;if (num LED_COUNT) {GPIO_PinWrite(Pin_LED[num].port, Pin_LED[num].num, 1);}else {retCode -1;}return retCode; }/**\fn int32_t LED_Off (uint32_t num)\brief Turn off requested LED\param[in] num LED number\returns- \b 0: function succeeded- \b -1: function failed */ int32_t LED_Off (uint32_t num) {int32_t retCode 0;if (num LED_COUNT) {GPIO_PinWrite(Pin_LED[num].port, Pin_LED[num].num, 0);}else {retCode -1;}return retCode; }/**\fn int32_t LED_SetOut (uint32_t val)\brief Write value to LEDs\param[in] val value to be displayed on LEDs\returns- \b 0: function succeeded- \b -1: function failed */ int32_t LED_SetOut (uint32_t val) {uint32_t n;for (n 0; n LED_COUNT; n) {if (val (1n)) {LED_On (n);} else {LED_Off(n);}}return 0; }/**\fn uint32_t LED_GetCount (void)\brief Get number of LEDs\return Number of available LEDs */ uint32_t LED_GetCount (void) {return LED_COUNT; } 代码分析该代码属于应用层为应用提供了几个操作LED的接口Board_LED.h声明功能接口代码里包含了GPIO_STM32F10x.h驱动接口头文件使用了GPIO接口驱动。通过它可以看出应用层的功能封装和实现基本不涉及寄存器操作。都是通过驱动接口配置和访问的。 main入口函数介绍 /***************************************************************************//** * \file main.c * * \details LED Blinking using RTX CMSIS V2 RTOS * * \author EmbeTronicX * * \Tested with Proteus * * *****************************************************************************/ #include RTE_Components.h #include CMSIS_device_header #include cmsis_os2.h #include stm32f10x.h#include Board_LED.h/* ** This thread will turns ON and turns OFF the PORT-D LEDs with 1second delay. ** ** Arguments: ** arg - Argument of this thread. osThreadNew()s 2nd arg has to come here. ** */ __NO_RETURN static void LED_Blink_PortD( void *arg ) {(void)arg; //unused variable//set Port D as output//GPIOD-MODER 0x55555555;for (;;) //infinite for loop{//Turn ON the LED of Port-DLED_On(3);osDelay(1000); //1sec delay//Turn OFF the LED of Port-DLED_Off(2);//GPIOD-BSRR 0xFFFF0000;osDelay(1000); //1sec delay} }/* ** This thread will turns ON and turns OFF the PORT-E LEDs with 3second delay. ** ** Arguments: ** arg - Argument of this thread. osThreadNew()s 2nd arg has to come here. ** */ __NO_RETURN static void LED_Blink_PortE( void *arg ) {(void)arg; //unused variable//set Port E as output//GPIOE-MODER 0x55555555;for (;;) //infinite for loop{//Turn ON the LED of Port-E//GPIOE-BSRR 0x0000FFFF;LED_SetOut(0);osDelay(3000); //3sec delay//Turn OFF the LED of Port-E//GPIOE-BSRR 0xFFFF0000;osDelay(3000); //3sec delayLED_SetOut(1);} }/* ** main function ** ** Arguments: ** none ** */ int main (void) {// System InitializationSystemCoreClockUpdate();LED_Initialize();osKernelInitialize(); // Initialize CMSIS-RTOSosThreadNew(LED_Blink_PortD, NULL, NULL); // Create application main threadosThreadNew(LED_Blink_PortE, NULL, NULL); // Create application main threadosKernelStart(); // Start thread executionfor (;;) {//Dummy infinite for loop.} } 以上是main入口函数的实现你有在里面发现寄存器和特殊的硬件操作吗没有的应用层看不到跟某一平台的相关性更别提会出现寄存器操作了。这跟以往的开发模式有很大的不同结构更清晰合理了。如果你的应用中混杂了寄存器或板级的驱动接口调用请留意这样用是否合适有没有其他的方式。 以上代码未移植嵌入式内核就可以使用RTX嵌入式系统啦是不是很简单和方便如果想换系统怎么办只需要改配置就行。如果要换单片机呢那么也放心你的很多应用层代码都是可以复用了仅是改下驱动层的接口参数配置这就是这一开发模式的好处。以上代码示例不是针对stm32这一种在keil中支持的任一单片机我都可以轻易切换。 串口驱动使用 可以看下串口的使用有多么的简单完全颠覆了以往传统的开发方式。只需先配置好串口硬件管脚后剩下的就是像上位机纯软件的开发一样调用接口函数即可以下示例可以看下够简单吧。 在RTE_device.h文件中配置串口一的硬件管脚如下 使用如下main.c #include string.h #include RTE_Components.h #include CMSIS_device_header #include cmsis_os2.h #include stm32f10x.h#include Board_LED.h #include Driver_USART.hextern ARM_DRIVER_USART Driver_USART1;/* Variable definitions ------------------------------------------------------*/ static uint8_t rxBuffer[1024] {0}; static uint8_t txBuffer[1024] {0};/* Function declarations -----------------------------------------------------*/ static void USART1_Callback(uint32_t event); /*** brief USART1 callback function.* param event: USART events notification mask.* return None.*/ static void USART1_Callback(uint32_t event) {if(event ARM_USART_EVENT_RX_TIMEOUT){Driver_USART1.Control(ARM_USART_ABORT_RECEIVE, 1);uint32_t length Driver_USART1.GetRxCount();memcpy(txBuffer, rxBuffer, length);Driver_USART1.Send(txBuffer, length);Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));} }void uart_init() {Driver_USART1.Initialize(USART1_Callback);Driver_USART1.PowerControl(ARM_POWER_FULL);Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS |ARM_USART_DATA_BITS_8 |ARM_USART_PARITY_NONE |ARM_USART_STOP_BITS_1 |ARM_USART_FLOW_CONTROL_NONE, 115200);Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer)); }关于CMSIS CMSIS 是一个独立于供应商的硬件抽象层适用于基于 Arm® Cortex® 处理器的微控制器。CMSIS Cortex 微控制器软件接口标准的主要目标是提高软件在不同微控制器和工具链之间的可移植性和可重用性。这允许来自不同来源的软件无缝集成在一起。一旦学会CMSIS 就可以通过使用标准化的软件功能来帮助加快软件开发。 CMSIS 具有模块化结构每个模块都可以独立使用或更新。一些模块是特定于设备的因此对于每个 ARM Cortex 微控制器系列都会创建一个 CMSIS 模块集合即设备系列包 (DFP)。有助于简化软件重用、减少微控制器开发人员的学习曲线、加速项目构建和调试从而缩短新应用程序的上市时间。 CMSIS 最初是作为基于 Arm® Cortex®-M 的处理器的独立于供应商的硬件抽象层后来扩展为支持基于 Arm Cortex-A 的入门级处理器。为了简化访问CMSIS 定义了通用工具接口并通过为处理器和外围设备提供简单的软件接口来实现一致的设备支持。 CMSIS 是与各种芯片和软件供应商密切合作而定义的它提供了一种通用方法来连接外围设备、实时操作系统和中间件组件。它旨在支持来自多个供应商的软件组件的组合。 CMSIS 的创建是为了帮助行业实现标准化。它在广泛的开发工具和微控制器中实现了一致的软件层和设备支持。 CMSIS 是在GitHub上开源和协作开发的。 CMSIS 驱动程序规范 是一种软件 API它描述了中间件堆栈和用户应用程序的外围驱动程序接口。CMSIS-Driver API 设计为通用且独立于特定的 RTOS使其可在广泛的受支持微控制器设备中重复使用。CMSIS-Driver API 涵盖了受支持外设类型的广泛用例但无法考虑所有潜在用例。随着时间的推移CMSIS-Driver API 将扩展到更多的组以涵盖新的用例。 CMSIS 软件包在带有头文件和文档的组件类CMSIS 驱动程序下发布 API 接口。这些头文件是实现标准化外设驱动接口的参考。这些实现通常在组件类CMSIS 驱动程序下的相关微控制器系列的设备系列包中发布。设备系列包可能包含组件类设备中的附加接口以使用附加设备特定接口例如内存总线、GPIO 或 DMA扩展此 CMSIS 驱动程序规范涵盖的标准外设驱动程序。 由上图可以看出中间件或上层应用通过CMSIS驱动接口跟底层的硬件进行了隔离。建议组件和应用开发上直接使用CMSIS提供的驱动接口最好不要直接调用Device跟特定平台相关的标准库或HAL库的接口除非迫不得已。这样可以做到底层硬件的变动而不影响中间件和上层业务。 CMSIS驱动接口使用文档地址Usage and Description 结语 最后欢迎大家体验Keil5的全新的RTE开发模式。总之使用也很简单关键是要转变思想一定要有软件分层的思想摒弃以往不好的开发习惯尤其是长期以来习惯操作寄存器的思维惯性。让代码分封更清晰模块化更利于复用让维护更简单让升级更方便。 当咱们还在卷寄存器操作的时候老外又一次走在了前列。推广下这一单片机开发理念这一开发理念是未来的趋势今后人人都可以根据需要使用不同的单片机快速的进行业务开发。会一种就行不用去卷各家不同单片机的操作。驱动封装是芯片或IDE厂家的事。国产IDE软件应该像keil学习让广大开发者好用才有市场才能国产化崛起 risc-v单片机是国产化弯道超车的机会但就是碎片化严重驱动封装的不太好用且没有好用的国产IDE。要是像stm32那般好用想不火都难。各家的IDE各自为战重复的造轮子没有统一的支持各个厂家的不同芯片。risc-v的世界缺乏像ARM这种的统一领导和规范得形成合力避免重复和各自为战才能扩大生态开放共建实现共赢。开发者没选一个芯片就得换套IDE就得重新熟悉一遍操作吗 市面上的各大 RISC-V 芯片或 IP 公司都在做自己的 IDE 用自己的工具链。那么为什么各家都在做各自的工具链我认为还是没有形成类似于 ARM 的 CMSIS 这样的嵌入式软件接口标准来统一管理底层软件接口于是乎就变成了各自玩各的没有统一。这也是导致 RISC-V 软件生态薄弱碎片化的一个重要因素严重影响其生态。大部分的 RISC-V 厂商的开发 IDE还是基于开源的 eclipse gcc toolchains openocd 的方案来开发和调试芯片产品虽然这种方案实现快些但是IDE太大太臃肿且仅支持自家的芯片。如果能基于notepad--用QT实现一款像Keil一样好用该多好。 最后期待国产单片机开发IDE软件也能朝着更好用易用的方向发展变得更好。 其他资源 CMSIS 驱动程序规范 STM32 RTOS - GPIO Tutorial (CMSIS V2) Documentation – Arm Developer CMSIS-Driver Version 2.8.0 https://www.icxbk.com/article/detail?aid483
http://www.w-s-a.com/news/743384/

相关文章:

  • 寻找网站建设_网站外包自助打印微信小程序免费制作平台
  • 台式机网站建设vk社交网站做婚介
  • 创建网站得花多少钱网站建设的技术路线
  • 图书馆网站建设汇报免费编程软件哪个好用
  • 手机搭建网站工具网站搜索引擎优化的基本内容
  • 网站快速排名二手交易网站开发技术路线
  • 官方网站开发公司施工企业会计王玉红课后答案
  • 网站建设能用手机制作吗网站建设所需物资
  • 阜阳做网站的公司阳江招聘网最新消息
  • 织梦可以做哪些类型型网站wordpress 融资
  • 建设银行手机银行官方网站下载安装腾讯企点账户中心
  • 品牌设计网站有哪些商务网站建设平台
  • 新增网站备案时间什么是软件外包产业
  • 张家界做网站买了网站模版怎么做
  • 六安品牌网站建设怎么样知名商城网站建设报价
  • 怎么上传自己做的网站杭州网站建设公司平台
  • 网站开发程序是什么知名的电子商务网站
  • 做pc端网站好么平台推广是什么意思
  • 农业信息网站建设意义淘宝官网首页网址
  • 重庆网站设计公司价格贵阳网站建设app开发
  • dw做网站怎么换图片编写网页所用的语言是
  • 外贸网站收录工具个人网站的备案
  • 正规的网站建设工作室海外高延迟服务器做网站
  • 网站设计确认函合肥做网站维护的公司
  • 小说网站推荐网站开发语言怎么查
  • 网页制作基础教程慕课版电子版那种登录才能查看的网站怎么做优化
  • 制作网站用的域名网站域名注册信息查询
  • 公司域名查询官方网站女教师遭网课入侵直播录屏曝
  • 网站开发社交网络功能的作用腾讯公司网站
  • 网站建设需要微信账号和密码网站建设工作汇报