Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
国民技术_N32G45x
【N32G457】基于RT-Thread内核的AUTOSAR在n32g上的实现
发布于 2022-03-19 19:05:08 浏览:2772
订阅该版
[tocm] # 一、项目介绍 随着小米宣布造车,当下“软件定义汽车”的趋势如火如荼,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的分层模型及各层简述 ![image.png](https://oss-club.rt-thread.org/uploads/20220319/005f1efb0b684c5d0c452542326dc2f0.png.webp) 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的任务由挂起态变为就绪态。 StatusType TerminateTask ( void ) 将任务由就绪态转为挂起态。 StatusType ChainTask ( TaskType
) 将当前任务由就绪转为挂起,并将TaskID的任务由挂起转为就绪,相当于TerminateTask和ActivateTask的连用。 StatusType Schedule ( void ) 执行一次调度。 ``` ### 2.2.2 事件api ``` StatusType SetEvent ( TaskType
EventMaskType
) 设置一个事件位,当执行SetEvent后等待该事件位的任务可以由等待态变为就绪态。 StatusType ClearEvent ( EventMaskType
) 清楚事件位 StatusType GetEvent ( TaskType
EventMaskRefType
) 返回TaskID任务的所有事件位 StatusType WaitEvent ( EventMaskType
) 等待事件位,等待事件位的任务由就绪态转为等待态。 ``` ### 2.2.3 报警器(闹钟)api ``` StatusType GetAlarmBase ( AlarmType
, AlarmBaseRefType
) 获取报警器的时基 StatusType GetAlarm ( AlarmType
TickRefType
) 获取闹钟当前的tick StatusType SetRelAlarm ( AlarmType
, TickType
, TickType
) 设置相对闹钟 StatusType SetAbsAlarm ( AlarmType
, TickType
, TickType
) 设置绝对闹钟 StatusType CancelAlarm ( AlarmType
) 取消闹钟 ``` # 三、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 软件框架说明 ![image.png](https://oss-club.rt-thread.org/uploads/20220319/c4b9a9bd5871df425fee1875c545ba78.png.webp) 在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。 ![image.png](https://oss-club.rt-thread.org/uploads/20220319/8ce31aad5e9fc83c89e95e03ab4f72fa.png.webp) # 五、RT-THREAD的移植 由于源码采用的构建工具是makefile,所以需要将rtthread的源码和头文件路径添加到makefile文件。编译下载到板子上可以看到rtthread正常运行。 ![image.png](https://oss-club.rt-thread.org/uploads/20220319/2469edb3fe0243013daec6897269017c.png.webp) # 六、仓库地址 由于arctic core没有github,不能采用fork的方式协作开发,我的代码上传到gitee提示版权风险无法转为公开的仓库,对源码感兴趣的小伙伴可以在下方留下gitee账号或发邮件给我369247354@qq.com,我拉你到项目组。源码从附件下载: [n32g45x_arctic_core.zip](https://oss-club.rt-thread.org/uploads/20220331/e4977bb710fe2a42cf63d731498375bb.zip) # 七、项目视频 https://www.bilibili.com/video/BV1Ma411b7kD/ # 八、总结和展望 本次移植过程中,mcal的移植较为轻松,适配n32g45x的寄存器花了不少时间,需要查看n32g45x的参考手册的寄存器定义一个一个的去改。移植rtthread到arctic core的源码比较简单,只是添加rtt的源码到arctic core的makefile。遗憾的是还没完成rtt适配OSEK/VDX的接口,希望对OSEK/VDX感兴趣的小伙伴加入进来,一起完成rtt对OESK/VDX的适配。
12
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
happycode999
这家伙很懒,什么也没写!
文章
28
回答
6
被采纳
0
关注TA
发私信
相关文章
1
[N32G457]移植sdio驱动后,开启sdio1系统挂掉
2
N32G457开发板使用AT组件编译出错
3
ADC采样只有0和3.3v?
4
基于N32G45X开发板建立工程失败?
5
有没有人N32G457在挂载SPI Flash上挂载文件系统成功的?
6
使用N32G457的us函数程序会卡死?
7
在程序里关闭JTAG 后,无法再次烧录程序
8
求一个N32系列QSPI驱动
9
N32G457 MPU6050软件包使用不成功
10
在N32G455 HTTP_OTA升级上,下载成功,无法跳转
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部