如果要选出飞凌嵌入式最热门的几款产品,FET3568-C系列核心板一定榜上有名。这款高性价比的全能型核心板上市两年来已赢得了数千家客户的青睐。飞凌嵌入式也在不断对它进行升级——从“配置新增”到“100%国产化认证”再到“新系统适配”,以满足更多行业客户的需求。
近期,飞凌嵌入式FET3568-C系列核心板再度迎来新升级——支持“AMP”双系统。
01
什么是“AMP”
AMP(非对称多处理)简单来说就是:多核处理器的每个核之间相互隔离,可以相对独立地运行不同的操作系统或裸机程序。这种运行模式比较适合高实时性的应用。
02
FET3568-C核心板AMP
飞凌嵌入式FET3568-C核心板搭载的RK3568处理器采用四核Cortex-A55架构,从架构上看属于“同构多核架构”。
RK3568的AMP SDK与Linux SDK相比,区别在于Linux SDK中使用的是SMP(对称多处理)模式,即只运行一个Linux操作系统,在该操作系统中管理全部四个核;而AMP SDK使用AMP的模式,四个核心中的三个核心共同运行一个Linux操作系统,另一个核心单独运行裸机程序。
由于高实时性任务是由运行裸机程序的核心专门处理的,所以这种运行模式可以很好地满足如电力互联网、电网继电保护、电力系统安全控制、工业自动化等领域的高实时性需求。
03
更低成本,更高实时性,更具优势
(1) 更低成本:
为了解决Linux系统主控实时性不足的问题,在传统应用中通常会采取外挂单片机的方式专门执行高实时性的程序。
而采用AMP系统就可以舍弃掉外置的单片机,在FET3568-C核心板上,可以将四个A55核中的一个核心分离出来作为实时核单独运行RT-Thread或裸机程序——只用一颗芯片就能够完成所有的工作,降低了硬件成本。
(2) 高实时性:
由于Linux系统实时性较低,所以无法用来执行对实时性要求高的任务。而裸机程序或者实时操作系统的实时性远高于Linux系统,同时也得益于FET3568-C核心板最高2.0GHz的高主频,运行实时操作系统的A55核也可以拥有很强的实时性。
04
核间通信
与其它多核异构架构的处理器相同,AMP也使用共享内存的方式在A核(Linux)与实时核(裸机或实时操作系统)之间进行数据传输。
通过物理内存DDR分配,将硬件层分为了两部分:TXVring Buffer(发送虚拟环状缓冲区)和RXVring Buffer(接收虚拟环状缓冲区);其中实时核从TXVring区发送数据,从RXVring区读取接收数据,A核反之。
05
AMP使用示例
目前飞凌嵌入式FET568-C核心板已提供GPIO、UART、SPI接口的使用示例,使用RPMSG进行核间通信。其它接口还在适配中,之后会陆续开放。裸机程序可以在提供的工具中使用JLINK仿真调试。
下面简要介绍一下裸机程序中UART接口的使用示例:
(1) 硬件连接
本示例使用的是UART5,使用跳线帽将OK3568-C开发板上的TX5与RX5短接。
(2) 设备树配置
为了防止Linux占用UART5的资源导致实时核无法使用UART5,需要先在设备树上的rockchip_amp节点添加对UART5的资源保护,包括时钟和pinctrl。
clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>,
pinctrl-names = “default”, ”uart5”;
pinctrl-1 = <&uart5m1_xfer>;
(3) 裸机程序的配置
UART接口使用介绍:
// 管脚配置:选择UART5的收发管脚。/ uart5 tx /
HAL_PINCTRL_SetIOMUX(GPIO_BANK3, GPIO_PIN_C2, PIN_CONFIG_MUX_FUNC4);
/ uart5 rx /
HAL_PINCTRL_SetIOMUX(GPIO_BANK3, GPIO_PIN_C3, PIN_CONFIG_MUX_FUNC4);
/ uart5 m1 /
HAL_PINCTRL_IOFuncSelForUART5(IOFUNC_SEL_M1);
// 通讯配置:波特率为115200,无校验,数据位8位,无流控,停止位1位。
/ uart5 config /
struct HAL_UART_CONFIG demo_uart_config = {
.baudRate = UART_BR_115200, // 波特率
.dataBit = UART_DATA_8B, // 数据位
.stopBit = UART_ONE_STOPBIT, // 停止位
.parity = UART_PARITY_DISABLE, // 校验
};
HAL_UART_Init(&g_uart5Dev, &demo_uart_config);
中断使能:配置并使能接收超时中断。
HAL_IRQ_HANDLER_SetIRQHandler(UART5_IRQn, uart5_isr, NULL);
HAL_GIC_Enable(UART5_IRQn);
HAL_UART_EnableIrq(g_uart5Dev.pReg, UART_IER_RDI);
// 执行流程
// 初始化完成后,会先发送一串数据。如果接收到数据,触发中断,然后将接收的数据从调试串口发送出来。
// 中断回调函数 int iir = 0;
iir = HAL_UART_GetIrqID(g_uart5Dev.pReg);
if (iir & UART_IIR_RX_TIMEOUT) {
do {
ret = HAL_UART_SerialIn(g_uart5Dev.pReg, &c, 1);
if (ret)
printf("%02x ", c);
} while (ret);
printf(“\n”);
}
示例使用:
根据OK3568-C开发板产品资料中提供的手册,在裸机程序的main函数中调用我们编写好的使用例程。
实验现象:
按照手册编译烧写完程序后,打开串口调试助手,打开对应串口,可以看到OK3568-C开发板开机后程序发出的数据。
在串口调试助手,输入任何数据并发送,触发接收中断,从实时核调试串口(uart4)就可以看到输入的数据了。