一、项目介绍

  随着小米宣布造车,当下“软件定义汽车”的趋势如火如荼,autosar的全称Automotive Open System Architecture,即汽车开放软件架构,这正如TCP/IP对网络进行统一,autosar是对汽车软件技术的统一,TCP/IP制定的初衷是为统一网络标准从而诞生了今天的互联网,而AUTOSAR的制定是为实现汽车电子软件的统一从而实现汽车电子软件的复用。本项目是基于autosar3.1的开源代码arctic core,在此基础上,完成在n32g45x上的mcal驱动,适配RT-Thread内核为autosar的操作系统。
  目前已完成mcal的mcu驱动,autosar的osek操作系统已经能在n32g45x上正常调度,移植rtthread到arctic core,但是在适配OSEK/VDX的接口过程中,发现这个适配工作不是一两个月所能完成,因为osek/vdx的标准非常严格,如果对OSEK/VDX感兴趣的小伙伴可以一起加入rtthread对osek/vdx的适配。

二、简述AUTOSAR及OSEK/VDX

2.1 AUTOSAR的分层模型及各层简述

  AUTOSAR从上往下分为应用层、RTE层和基础软件层(BSW)。
  应用层由多个软件组件SWC组成,每个SWC是具有一定功能的模块,如汽车发动机控制逻辑,这些模块可以由matlab的autosar软件包依据模型进行设计;RTE全称Runtime Environment,即运行时环境,它的内部是一条autosar框架定义的虚拟功能总线(VFB),SWC、BSW通过这条虚拟功能总线进行通信。
  BSW从上到下分为服务层、ECU抽象层、MCU抽象层,分层的目的是为了实现各层的复用和对下一层的隔离,这正如RT-Thread的分层思想那样,RT-Thread可以适配不同的MCU就是因为采用了驱动和设备分离的策略,RT-Thread的同一个设备因为注册了不同的驱动就可以驱动不同的MCU。在AUTOSAR中,和MCU有关的一层是MCU抽象层,及MCAL,用RTT的驱动和设备分离的思想来理解autosar的mcal就是同一个ECU抽象层因为注册了不同的MCU驱动就可以驱动不同的MCU。在autosar的成员中就有nxp这样的芯片原厂提供autosar的mcal。

2.2 简述OSEK/VDX接口api

  在autosar的服务层中有一个符合OSEK/VDX标准的操作系统,负责内存管理、对各个功能的调度,api分为任务管理、中断处理、事件机制、资源管理、报警器。

2.2.1 任务管理api

StatusType ActivateTask ( TaskType <TaskID> )
将任务号为TaskID的任务由挂起态变为就绪态。
StatusType TerminateTask ( void )
将任务由就绪态转为挂起态。
StatusType ChainTask ( TaskType <TaskID> )
将当前任务由就绪转为挂起,并将TaskID的任务由挂起转为就绪,相当于TerminateTask和ActivateTask的连用。
StatusType Schedule ( void )
执行一次调度。

2.2.2 事件api

StatusType SetEvent ( TaskType <TaskID> EventMaskType <Mask> )
设置一个事件位,当执行SetEvent后等待该事件位的任务可以由等待态变为就绪态。
StatusType ClearEvent ( EventMaskType <Mask> )
清楚事件位
StatusType GetEvent ( TaskType <TaskID> EventMaskRefType <Event> )
返回TaskID任务的所有事件位
StatusType WaitEvent ( EventMaskType <Mask> )
等待事件位,等待事件位的任务由就绪态转为等待态。

2.2.3 报警器(闹钟)api

StatusType GetAlarmBase ( AlarmType <AlarmID>, AlarmBaseRefType <Info> )
获取报警器的时基
StatusType GetAlarm ( AlarmType <AlarmID> TickRefType <Tick>)
获取闹钟当前的tick
StatusType SetRelAlarm ( AlarmType <AlarmID>, TickType <increment>, TickType <cycle> )
设置相对闹钟
StatusType SetAbsAlarm ( AlarmType <AlarmID>, TickType <start>,
TickType <cycle> )
设置绝对闹钟
StatusType CancelAlarm ( AlarmType <AlarmID> )
取消闹钟

三、AUTOSAR开源代码arctic core软件框架和分析

3.1 相关资源链接

arctic core官网:http://dev.arccore.com/public/user-doc/UD441x/Arctic-Core-4.0_9503291.html
arctic core源码获取 http://my.arccore.com/hg
源码构建说明 http://dev.arccore.com/public/userdoc/UD441x/Makesystem_23789620.html

3.2 软件框架说明

在arch文件夹中的文件为MCU内核架构相关的文件,如cortex-m3,主要内容为M3的启动文件(见M3编程指南),MCU的固件库。
在boards文件夹中的文件为各个MCU的实现,包括对板子的配置。
system文件夹中包含了一个OSEK/VDX标准的操作系统。

四、在N32G45X上完成AUTOSAR的MCAL

以MCU驱动的时钟设置为例,static void SetClocks(Mcu_ClockSettingConfigType *clockSettingsPtr)是autosar的mcal定义的一个接口,用于设置MCU的时钟,在n32g45x的实现如下:

/*** Set bus clocks. SysClk,AHBClk,APB1Clk,APB2Clk*/
static void SetClocks(Mcu_ClockSettingConfigType *clockSettingsPtr)
{volatile uint32 StartUpCounter = 0, HSEStatus = 0;/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*//* Enable HSE */RCC->CTRL |= ((uint32_t)RCC_CTRL_HSEEN);/* Wait till HSE is ready and if Time out is reached exit */do{HSEStatus = RCC->CTRL & RCC_CTRL_HSERDF;StartUpCounter++;} while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));if ((RCC->CTRL & RCC_CTRL_HSERDF) != RESET){HSEStatus = (uint32_t)0x01;}else{HSEStatus = (uint32_t)0x00;}if (HSEStatus == (uint32_t)0x01){/* Enable Prefetch Buffer */FLASH->AC |= FLASH_AC_PRFTBFEN;/* Flash 2 wait state */FLASH->AC &= (uint32_t)((uint32_t)~FLASH_AC_LATENCY);FLASH->AC |= (uint32_t)FLASH_AC_LATENCY_2;/* HCLK = SYSCLK */RCC->CFG |= (uint32_t)RCC_CFG_AHBPRES_DIV1;/* PCLK2 = HCLK */RCC->CFG |= (uint32_t)RCC_CFG_APB2PRES_DIV1;/* PCLK1 = HCLK */RCC->CFG |= (uint32_t)RCC_CFG_APB1PRES_DIV2;#ifdef STM32F10X_CL/* Configure PLLs ------------------------------------------------------*//* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */RCC->CFG2 &= (uint32_t)~(RCC_CFG2_PREDIV2 | RCC_CFG2_PLL2MUL |RCC_CFG2_PREDIV1 | RCC_CFG2_PREDIV1SRC);RCC->CFG2 |= (uint32_t)(RCC_CFG2_PREDIV2_DIV5 | GetPll2ValueFromMult(clockSettingsPtr->Pll2) |RCC_CFG2_PREDIV1SRC_PLL2 | RCC_CFG2_PREDIV1_DIV5);/* Enable PLL2 */RCC->CTRL |= RCC_CR_PLL2ON;/* Wait till PLL2 is ready */while((RCC->CTRL & RCC_CR_PLL2RDY) == 0){}/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */RCC->CFG &= (uint32_t)~(RCC_CFG_PLLXTPRE | RCC_CFG_PLLSRC | RCC_CFG_PLLMULL);RCC->CFG |= (uint32_t)(RCC_CFG_PLLXTPRE_PREDIV1 | RCC_CFG_PLLSRC_PREDIV1 |GetPllValueFromMult(clockSettingsPtr->Pll1));
#else/*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */RCC->CFG &= (uint32_t)((uint32_t)~(RCC_CFG_PLLSRC | RCC_CFG_PLLHSEPRES |RCC_CFG_PLLMULFCT));RCC->CFG |= (uint32_t)(RCC_CFG_PLLSRC_HSE | GetPllValueFromMult(clockSettingsPtr->Pll1));
#endif /* STM32F10X_CL *//* Enable PLL */RCC->CTRL |= RCC_CTRL_PLLEN;/* Wait till PLL is ready */while((RCC->CTRL & RCC_CTRL_PLLRDF) == 0){}/* Select PLL as system clock source */RCC->CFG &= (uint32_t)((uint32_t)~(RCC_CFG_SCLKSW));RCC->CFG |= (uint32_t)RCC_CFG_SCLKSW_PLL;/* Wait till PLL is used as system clock source */while ((RCC->CFG & (uint32_t)RCC_CFG_SCLKSTS) != (uint32_t)0x08){}}else{ /* HSE fails to start-up, the application will have wrong clock */NVIC_SystemReset();}
}

  写好mcal的mcu后编译成可执行文件下载到板子上,AUTOSAR能够在n32g45x上正常运行,可以看到三个任务块在调度。下载工具用的是pyocd。

五、RT-THREAD的移植

  由于源码采用的构建工具是makefile,所以需要将rtthread的源码和头文件路径添加到makefile文件。编译下载到板子上可以看到rtthread正常运行。

六、仓库地址

  由于arctic core没有github,不能采用fork的方式协作开发,我的代码上传到gitee提示版权风险无法转为公开的仓库,对源码感兴趣的小伙伴可以在下方留下gitee账号或发邮件给我369247354@qq.com,我拉你到项目组。源码从附件下载:
n32g_arctic_core.zip

七、总结和展望

  本次移植过程中,mcal的移植较为轻松,适配n32g45x的寄存器花了不少时间,需要查看n32g45x的参考手册的寄存器定义一个一个的去改。移植rtthread到arctic core的源码比较简单,只是添加rtt的源码到arctic core的makefile。遗憾的是还没完成rtt适配OSEK/VDX的接口,希望对OSEK/VDX感兴趣的小伙伴加入进来,一起完成rtt对OESK/VDX的适配。

【AUTOSAR】基于RT-Thread内核的AUTOSAR在n32g上的实现相关推荐

  1. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  2. autosar架构详细介绍_基于MATLAB环境搭建满足AUTOSAR标准的模型高级培训班

    一.课程目标 1.加深对AUTOSAR标准的认识和理解 2.能够在MATLAB平台上搭建满足AUTOSAR标准要求的应用层软件模型 3.掌握建模过程中的关键概念并能够灵活运用 4.掌握一些高级建模技巧 ...

  3. 基于SOME/IP的AP AUTOSAR实战步骤

    一.方法论与Manifest 01 UML类图关系 由于我们将会大量参考AP AUTOSAR元模型,因此,我们先根据上期的内容简单回顾一下UML类图,UML共有6种类图关系: 依赖(Dependenc ...

  4. 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

    最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...

  5. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  6. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  7. RT Thread根据开发板制作BSP方法

    之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...

  8. RT Thread利用STM32CUBEMX和RT Thread studio来创建模板工程

    (1)RT Thread利用STM32CUBEMX来创建模板工程 1.参考文档: 基于 CubeMX 移植 RT-Thread Nano:RT-Thread 文档中心 注意:串口2必须使能异步模式(启 ...

  9. xpt 2046的触摸屏 rt thread设备驱动框架

    1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...

  10. 基于Boost.Thread 的测试

    基于Boost.Thread 的测试 实现功能 C++实现代码 实现功能 基于Boost.Thread 的测试 C++实现代码 #include <sstream> #include &l ...

最新文章

  1. java Windows7 下环境变量设置
  2. java pkcs#11读取证书加解密(初学-分享)
  3. Codeforces Round #167 (Div. 1) C. Dima and Horses(BFS+贪心)
  4. Git之深入解析工作流程、常用命令与Reset模式分析
  5. ActiveMQ持久化方式
  6. Win10 第三方浏览器无法上网或者上网速度慢 的终极解决方案
  7. CNBlog客户端--第一阶段记录
  8. vs2013 win10 Caffe的编译安装(微软版本)
  9. c#退出应用程序办法
  10. HTML+CSS【超浪漫的表白网页代码】不会编程也能制作送给女朋友的表白网站 (1)
  11. C-V2X行业现状、产业化部署与演进路线
  12. Android之Dex动态加载机制解析
  13. Tilera推用于云计算的多核处理器Meshed
  14. Environment 的使用
  15. 可以带着游泳的耳机、游泳听歌的运动耳机推荐
  16. zone2021 E-Sneaking
  17. 产品经理在路上之二——用户/行业调研
  18. 蒋涛:这五件事发生的那一刻,即是ICO泡沫破裂的那一天
  19. 解决联发科mt7921网卡在ubuntu下没有wifi的问题
  20. $.inArray函数判断数组中的是否包含字符串

热门文章

  1. heroku常用命令示例(三)与AWS S3互动
  2. 图像识别最好的算法,图片相似度识别算法
  3. 001-三阶魔方-概述及层先法
  4. 使用spire.doc for java为word添加页码、文字水印、书签(去除警告信息)
  5. 2022电大国家开放大学网上形考任务-地域文化(本)(山东)非免费(非答案)
  6. 运营商精准大数据外呼系统
  7. 防火墙的访问控制策略
  8. matlab中stract用法_matlab初学之strcat、num2str
  9. MapReduce的C#实现及单元测试(试验)
  10. 为什么计算机连不上无线网络,笔记本无线连不上是什么原因_为什么笔记本电脑连不上wifi-win7之家...