最新文�? 原创 : Verilog 实现 UART TX 发送器 原创 : VGA 时序分析 原创 : Verilog 实现 VGA 接口时序 原创 : LCD 时序分析 转载 : Xilinx FPGA 初探内部时钟管理
原创 : Zynq-PS-SDK(8) 之双核通信 (AMP) 历史版本:
上次修改时间:
; CPU1 的交互方式(SGI 软中断);\n\n\n我们板端板载 DDR 容量为 1GB,DDR 的地址空间是:\n\n![](https://www.testingcloud.club/sapi/api/image_download/e644506b-2580-11f0-8100-00e05a680215.png)\n\n \n\n## 0、Hardware\n\n硬件上,基于前面的设计继续进行(参考《[Zynq-PS-SDK 之自定义 AXI-Lite IP](https://blog.csdn.net/zhoutaopower/article/details/115338677?spm=1001.2014.3001.5501)》和《[Zynq-PS-SDK 之 AXI GPIO](https://blog.csdn.net/zhoutaopower/article/details/115487481)》):\n\n![](https://www.testingcloud.club/sapi/api/image_download/e65c69d8-2580-11f0-8100-00e05a680215.png)\n\n \n\n## 1、SDK Configurations\n\n首先在 SDK 中增加两套 Applications,一个用于 CPU0,另一个用于 CPU1:\n\n![](https://www.testingcloud.club/sapi/api/image_download/e6747091-2580-11f0-8100-00e05a680215.png)\n\n编辑 CPU 0 的链接脚本,使得他的运行地址 0x0010_0000 和 Size 0x1FF0_0000 (目的是让两个工程在 DDR 中的运行地址分离开):\n\n![](https://www.testingcloud.club/sapi/api/image_download/e69746a5-2580-11f0-8100-00e05a680215.png)\n\n \n\n编辑 CPU 1 的链接脚本,使得他的运行地址 0x2000_0000 和 Size 0x1FFF_FF00:\n\n![](https://www.testingcloud.club/sapi/api/image_download/e6d720d4-2580-11f0-8100-00e05a680215.png)\n\n \n\n选择 CPU1 的  bsp,右键进入 【**Board Support Package Settings**】,增加 CFLAG,导入 USE_AMP=1 这个宏;\n\n![](https://www.testingcloud.club/sapi/api/image_download/e70f1050-2580-11f0-8100-00e05a680215.png)\n\n配置 CPU1 使用的处理器为 ps7_cortexa9_1:\n\n![](https://www.testingcloud.club/sapi/api/image_download/e722dc7a-2580-11f0-8100-00e05a680215.png)\n\n \n\n配置 Run Configurations:勾选如下:\n\n![](https://www.testingcloud.club/sapi/api/image_download/e73943df-2580-11f0-8100-00e05a680215.png)\n\n配置下载的时候,同时下载两个 elf:\n\n![](https://www.testingcloud.club/sapi/api/image_download/e76150a0-2580-11f0-8100-00e05a680215.png)\n\n \n\n## 2、Source Code\n\n代码上,我在 CPU 0 的启动阶段去将 CPU1 唤醒,并将运行地址直接指向链接脚本那的起始地址(其实就是 CPU1 的中断向量表首地址);\n\n基于之前的设计中,我继承了一些东西,但这并不影响我这边验证 AMP:\n\n### 2.1、CPU 0\n\n在 CPU 0 的代码中,唤醒了 CPU1,初始化了 GIC,ScuTimer,使用软件中断来与 CPU 1 通信,自定义了 :\n\n```\n/***************************** Include Files *********************************/\n\n#include \"xparameters.h\"\n#include \"xscutimer.h\"\n#include \"xscugic.h\"\n#include \"xil_exception.h\"\n#include \"xil_printf.h\"\n#include \"xgpiops.h\"\n#include \"steph_axi_pwm.h\"\n#include \"sleep.h\"\n#include \"xil_mmu.h\"\n\n/************************** Constant Definitions *****************************/\n\n/*\n * The following constants map to the XPAR parameters created in the\n * xparameters.h file. They are only defined here such that a user can easily\n * change all the needed parameters in one place.\n */\n#define TIMER_DEVICE_ID XPAR_XSCUTIMER_0_DEVICE_ID\n#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID\n#define TIMER_IRPT_INTR XPAR_SCUTIMER_INTR\n\n#define TIMER_LOAD_VALUE (XPAR_PS7_CORTEXA9_0_CPU_CLK_FREQ_HZ/2 - 1)\n#define TIMEOUT_CNT (30)\n#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID\n\n/**************************** Type Definitions *******************************/\n\n/***************** Macros (Inline Functions) Definitions *********************/\n#define RD_32BIT_REG(addr) (*(volatile uint32_t *)(addr))\n#define WR_32BIT_REG(addr, value) (*(volatile uint32_t *)(addr)) = (value)\n\n#define STEPH_MIO_0 0\n#define STEPH_MIO_1 13\n\n#define STEPH_EMIO_0 54\n#define STEPH_EMIO_1 55\n#define STEPH_EMIO_2 56\n#define STEPH_EMIO_3 57\n\n#define MIO_OUTPUT 1\n#define MIO_INPUT 0\n\n#define MIO_OUTPUT_EN 1\n#define MIO_OUTPUT_DIS 0\n\n/* Accroding to the system.hdf file axi_gpio_0 */\n#define AXI_GPIO_0_BASE_ADDR 0x41200000\n#define GPIO_DATA_OFFSET 0x00\n#define GPIO_TRI_OFFSET 0x04\n#define GPIO_2_DATA_OFFSET 0x08\n#define GPIO_2_TRI_OFFSET 0x0C\n#define GIER_OFFSET 0x11C\n#define IP_ISR_OFFSET 0x120\n#define IP_IER_OFFSET 0x128\n\n/* PWM Configurations */\n#define PWM_CYCLE 2000\n#define PWM_DUTY_STEP 3\n\n/* CPU1 Address */\n#define WAKEUP_CPU1_ADDR 0xFFFFFFF0\n#define CPU1_RUN_ADDR 0x20000000\n#define SOFTWARE_IRQ_ID_TO_CPU0 1\n#define SOFTWARE_IRQ_ID_TO_CPU1 2\n\n#define CPU_0_ID 0x01\n#define CPU_1_ID 0x02\n\n#define sev() __asm__(\"sev\")\n\n#define FNC_CHECK_RETURN(Status) \\\n{ \\\n if (Status != XST_SUCCESS) \\\n return XST_FAILURE; \\\n}\n\n#define FNC_CHECK_NULL_POINTER(PTR) \\\n{ \\\n if (NULL == IntcConfig) \\\n return XST_FAILURE; \\\n}\n/************************** Function Prototypes ******************************/\n\nstatic void TimerIRQHandler(void *CallBackRef);\nstatic void SoftwareIRQHandler(void *CallBackRef);\n\n/************************** Variable Definitions *****************************/\n\nXScuTimer TimerInstance; /* Cortex A9 Scu Private Timer Instance */\nXScuGic IntcInstance; /* Interrupt Controller Instance */\nXGpioPs Gpio;\n\nvolatile int TimerExpired;\nvolatile uint8_t trigger_cpu1 = 1;\n\nstatic void Steph_AXI_LED_On(void)\n{\n WR_32BIT_REG(AXI_GPIO_0_BASE_ADDR + GPIO_DATA_OFFSET, 0x00);\n}\n\nstatic void Steph_AXI_LED_Off(void)\n{\n WR_32BIT_REG(AXI_GPIO_0_BASE_ADDR + GPIO_DATA_OFFSET, 0x0F);\n}\n\nstatic void Steph_AXI_GPIO_Init(void)\n{\n // Set as output\n Steph_AXI_LED_Off();\n WR_32BIT_REG(AXI_GPIO_0_BASE_ADDR + GPIO_TRI_OFFSET, 0x00);\n}\n\nstatic void Steph_PWM_ConfigCycle(uint32_t cycle)\n{\n STEPH_AXI_PWM_mWriteReg(XPAR_STEPH_AXI_PWM_0_S00_AXI_BASEADDR, STEPH_AXI_PWM_S00_AXI_SLV_REG0_OFFSET, cycle);\n}\n\nstatic void Steph_PWM_ConfigDuty(uint32_t duty)\n{\n STEPH_AXI_PWM_mWriteReg(XPAR_STEPH_AXI_PWM_0_S00_AXI_BASEADDR, STEPH_AXI_PWM_S00_AXI_SLV_REG1_OFFSET, duty);\n}\n\nstatic void Steph_AXI_PWM_Init(void)\n{\n // The frequency of the PWM controller is 50MHz\n Steph_PWM_ConfigCycle(PWM_CYCLE);\n Steph_PWM_ConfigDuty(0x00);\n}\n\nuint32_t Steph_LEDInit(void)\n{\n XGpioPs_Config *ConfigPtr = NULL;\n int Status = XST_SUCCESS;\n\n ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);\n if(!ConfigPtr)\n {\n xil_printf(\"XGpioPs_LookupConfig Error.\\r\\n\");\n return XST_FAILURE;\n }\n\n Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,\n ConfigPtr->;BaseAddr);\n\n if (Status != XST_SUCCESS) {\n xil_printf(\"XGpioPs_CfgInitialize Error.\\r\\n\");\n return XST_FAILURE;\n }\n\n // For MIO\n XGpioPs_SetDirectionPin(&Gpio, STEPH_MIO_0, MIO_OUTPUT);\n XGpioPs_SetDirectionPin(&Gpio, STEPH_MIO_1, MIO_OUTPUT);\n\n XGpioPs_SetOutputEnablePin(&Gpio, STEPH_MIO_0, MIO_OUTPUT_EN);\n XGpioPs_SetOutputEnablePin(&Gpio, STEPH_MIO_1, MIO_OUTPUT_EN);\n xil_printf(\"Steph_LED MIO Initialize Finished...\\r\\n\");\n\n // For EMIO\n XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_0, MIO_OUTPUT);\n\n XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_0, MIO_OUTPUT_EN);\n xil_printf(\"Steph_LED EMIO Initialize Finished...\\r\\n\");\n\n Steph_AXI_GPIO_Init();\n xil_printf(\"Steph_LED AXI GPIO Initialize Finished...\\r\\n\");\n\n Steph_AXI_PWM_Init();\n xil_printf(\"Steph_LED AXI PWM Initialize Finished...\\r\\n\");\n\n return Status;\n}\n\nvoid LED_OFF(uint32_t pin)\n{\n XGpioPs_WritePin(&Gpio, pin, 0x1);\n}\n\nvoid LED_ON(uint32_t pin)\n{\n XGpioPs_WritePin(&Gpio, pin, 0x0);\n}\n\n\nstatic void Steph_SetupCpu1(void)\n{\n xil_printf(\"Close Cache...\\r\\n\");\n Xil_SetTlbAttributes(0xFFFF0000, 0x14de2);\n xil_printf(\"Waking up CPU1...\\r\\n\");\n Xil_Out32(WAKEUP_CPU1_ADDR, CPU1_RUN_ADDR);\n dmb();\n sev();\n}\n\nunsigned long Steph_GetSiliconVersion (void) {\n // Read PS version from MCTRL register [31:28]\n unsigned long mask = 0xF0000000;\n unsigned long *addr = (unsigned long*) 0XF8007080;\n unsigned long ps_version = (*addr & mask) >;>; 28;\n return ps_version;\n}\n\nint _Steph_RegisterIRQHandler(XScuGic *InstancePtr, uint16_t IntId, void *Handler, void *CallBackRef)\n{\n int Status = XST_SUCCESS;\n\n Status = XScuGic_Connect(InstancePtr, IntId,\n (Xil_ExceptionHandler)Handler, (void *)CallBackRef);\n FNC_CHECK_RETURN(Status);\n\n XScuGic_Enable(InstancePtr, IntId);\n\n return Status;\n}\n\nint Steph_RegisterScuTimerHandler(void *Handler)\n{\n return _Steph_RegisterIRQHandler(&IntcInstance, TIMER_IRPT_INTR, (void *)Handler, (void *)&TimerInstance);\n}\n\nint Steph_RegisterSoftwareHandler(void *Handler)\n{\n return _Steph_RegisterIRQHandler(&IntcInstance, SOFTWARE_IRQ_ID_TO_CPU0, (void *)Handler, (void *)&IntcInstance); \n}\n\nint Steph_GicInit(void)\n{\n int Status = XST_SUCCESS;\n XScuGic_Config *IntcConfig;\n XScuGic *IntcInstancePtr = &IntcInstance;\n\n IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);\n FNC_CHECK_NULL_POINTER(IntcConfig);\n\n Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig, IntcConfig->;CpuBaseAddress);\n FNC_CHECK_RETURN(Status);\n\n Xil_ExceptionInit();\n\n Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, IntcInstancePtr);\n\n Xil_ExceptionEnable();\n\n return Status;\n}\n\nint Steph_ScuTimerInit(void)\n{\n int Status = XST_SUCCESS;\n XScuTimer_Config *ConfigPtr;\n XScuTimer *TimerInstancePtr = &TimerInstance;\n\n ConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);\n\n Status = XScuTimer_CfgInitialize(TimerInstancePtr, ConfigPtr, ConfigPtr->;BaseAddr);\n FNC_CHECK_RETURN(Status);\n\n Status = XScuTimer_SelfTest(TimerInstancePtr);\n FNC_CHECK_RETURN(Status);\n\n XScuTimer_EnableAutoReload(TimerInstancePtr);\n\n XScuTimer_LoadTimer(TimerInstancePtr, TIMER_LOAD_VALUE);\n\n XScuTimer_EnableInterrupt(TimerInstancePtr);\n\n Steph_RegisterScuTimerHandler((void *)TimerIRQHandler);\n\n XScuTimer_Start(TimerInstancePtr);\n\n return Status;\n}\n\nint Steph_SoftwareInterruptInit(void)\n{\n return Steph_RegisterSoftwareHandler((void *)SoftwareIRQHandler);\n}\n\nint main(void)\n{\n uint32_t pwm_duty = 0;\n\n xil_printf(\"####### StephenZhou CPU 0 #######\\r\\n\");\n xil_printf(\"SiliconVersion=0x%08X\\r\\n\", Steph_GetSiliconVersion());\n\n Steph_SetupCpu1();\n xil_printf(\"SetupCpu1 Finished...\\r\\n\");\n\n Steph_LEDInit();\n xil_printf(\"LED Init Finished...\\r\\n\");\n\n Steph_GicInit();\n xil_printf(\"GIC Init Finished...\\r\\n\");\n\n Steph_ScuTimerInit();\n xil_printf(\"Scu Timer Init Finished...\\r\\n\");\n\n Steph_SoftwareInterruptInit();\n xil_printf(\"Software Interrupt Init Finished...\\r\\n\");\n\n while (1)\n {\n if (pwm_duty <; PWM_CYCLE)\n {\n pwm_duty += PWM_DUTY_STEP;\n }\n else\n {\n pwm_duty = 0;\n }\n Steph_PWM_ConfigDuty(pwm_duty);\n\n usleep(1000);\n\n if (trigger_cpu1)\n {\n // Software interrupt to CPU1\n XScuGic_SoftwareIntr(&IntcInstance, SOFTWARE_IRQ_ID_TO_CPU1, CPU_1_ID);\n\n trigger_cpu1 = 0;\n }\n }\n \n return XST_SUCCESS;\n}\n\nstatic void TimerIRQHandler(void *CallBackRef)\n{\n XScuTimer *TimerInstancePtr = (XScuTimer *) CallBackRef;\n\n if (XScuTimer_IsExpired(TimerInstancePtr)) {\n XScuTimer_ClearInterruptStatus(TimerInstancePtr);\n TimerExpired++;\n if(TimerExpired%2)\n {\n LED_OFF(STEPH_MIO_0);\n LED_OFF(STEPH_MIO_1);\n\n LED_OFF(STEPH_EMIO_0);\n\n Steph_AXI_LED_Off();\n }\n else\n {\n LED_ON(STEPH_MIO_0);\n LED_ON(STEPH_MIO_1);\n\n LED_ON(STEPH_EMIO_0);\n\n Steph_AXI_LED_On();\n }\n xil_printf(\"Timer Counter=%d\\r\\n\", TimerExpired);\n\n }\n}\n\nstatic void SoftwareIRQHandler(void *CallBackRef)\n{\n xil_printf(\"Soft Interrupt from CPU1\\r\\n\") ;\n trigger_cpu1 = 1;\n}\n\n```\n\n \n\n \n\n### 2.2、CPU 1\n\n在 CPU 1 代码中,接收到来自 CPU 0 的中断,进行回应,并拉另一个中断(SGI)用于通知 CPU 0:\n\n```\n#include <;stdio.h>;\n#include \"platform.h\"\n#include \"xil_printf.h\"\n#include \"xil_mmu.h\"\n#include \"xparameters.h\"\n#include \"xscutimer.h\"\n#include \"xscugic.h\"\n#include \"xil_exception.h\"\n#include \"xgpiops.h\"\n#include \"sleep.h\"\n\n#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID\n\n#define SOFTWARE_IRQ_ID_TO_CPU0 1\n#define SOFTWARE_IRQ_ID_TO_CPU1 2\n\n#define CPU_0_ID 0x01\n#define CPU_1_ID 0x02\n\n#define FNC_CHECK_RETURN(Status) \\\n{ \\\n if (Status != XST_SUCCESS) \\\n return XST_FAILURE; \\\n}\n\n#define FNC_CHECK_NULL_POINTER(PTR) \\\n{ \\\n if (NULL == IntcConfig) \\\n return XST_FAILURE; \\\n}\n\nstatic void SoftwareIRQHandler(void *CallBackRef);\n\nXScuGic IntcInstance;\n\nvolatile uint8_t trigger_cpu0 = 1;\n\nint Steph_GicInit(void)\n{\n int Status = XST_SUCCESS;\n XScuGic_Config *IntcConfig;\n XScuGic *IntcInstancePtr = &IntcInstance;\n\n IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);\n FNC_CHECK_NULL_POINTER(IntcConfig);\n\n Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig, IntcConfig->;CpuBaseAddress);\n FNC_CHECK_RETURN(Status);\n\n Xil_ExceptionInit();\n\n Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, IntcInstancePtr);\n\n Xil_ExceptionEnable();\n\n return Status;\n}\n\nstatic void SoftwareIRQHandler(void *CallBackRef)\n{\n xil_printf(\"Soft Interrupt from CPU0\\r\\n\") ;\n trigger_cpu0 = 1;\n}\n\nint _Steph_RegisterIRQHandler(XScuGic *InstancePtr, uint16_t IntId, void *Handler, void *CallBackRef)\n{\n int Status = XST_SUCCESS;\n\n Status = XScuGic_Connect(InstancePtr, IntId,\n (Xil_ExceptionHandler)Handler, (void *)CallBackRef);\n FNC_CHECK_RETURN(Status);\n\n XScuGic_Enable(InstancePtr, IntId);\n\n return Status;\n}\n\nint Steph_RegisterSoftwareHandler(void *Handler)\n{\n return _Steph_RegisterIRQHandler(&IntcInstance, SOFTWARE_IRQ_ID_TO_CPU1, (void *)Handler, (void *)&IntcInstance);\n}\n\nint Steph_SoftwareInterruptInit(void)\n{\n return Steph_RegisterSoftwareHandler((void *)SoftwareIRQHandler);\n}\n\nint main()\n{\n init_platform();\n\n Xil_SetTlbAttributes(0xFFFF0000, 0x14de2);\n\n Steph_GicInit();\n Steph_SoftwareInterruptInit();\n\n while (1)\n {\n if(trigger_cpu0)\n {\n XScuGic_SoftwareIntr(&IntcInstance, SOFTWARE_IRQ_ID_TO_CPU0, CPU_0_ID);\n trigger_cpu0 = 0;\n }\n usleep(1000000);\n }\n\n cleanup_platform();\n return 0;\n}\n```\n\n串口的打印如下:\n\n![](https://www.testingcloud.club/sapi/api/image_download/e776aa0f-2580-11f0-8100-00e05a680215.png)\n\n \n\n相关代码和工程在 gitee 持续更新:\n\n> \n[https://gitee.com/stephenzhou-tech/Zynq7020_PS](https://gitee.com/stephenzhou-tech/Zynq7020_PS)\n\n\n \n -->
0条评�?
全部评论

关于博主

an actually real engineer

通信工程专业毕业,7年开发经验

技术栈:

精通c/c++

精通golang

熟悉常见的脚本,js,lua,python,php

熟悉电路基础,嵌入式,单片机

耕耘领域:

服务端开发

嵌入式开发

git

>

gin接口代码CURD生成工具

sql ddl to struct and markdown,将sql表自动化生成代码内对应的结构体和markdown表格格式,节省宝贵的时间。

输入ddl:
输出代码:

qt .ui文件转css文件

duilib xml 自动生成绑定控件代码

协议调试器

基于lua虚拟机的的协议调试器软件 支持的协议有:

串口

tcp客户端/服务端

udp 组播/udp节点

tcp websocket 客户端/服务端

软件界面

使用例子: 通过脚本来获得接收到的数据并写入文件和展示在界面上

下载地址和源码

duilib版本源码 qt qml版本源码 二进制包

webrtc easy demo

webrtc c++ native 库 demo 实现功能:

基于QT

webrtc摄像头/桌面捕获功能

opengl渲染/多播放窗格管理

janus meeting room

下载地址和源码

源码 二进制包

wifi,蓝牙 - 无线开关

实现功能:

通过wifi/蓝牙实现远程开关电器或者其他电子设备

电路原理图:

实物图:

深度学习验证工具

vtk+pcl 点云编辑工具

实现功能:

1. 点云文件加载显示(.pcd obj stl)

2. 点云重建

3. 点云三角化

4. 点云缩放

下载地址:

源码 二进制包

虚拟示波器

硬件实物图:

实现原理

基本性能

采集频率: 取决于外部adc模块和ebaz4205矿板的以太网接口速率,最高可以达到100M/8 约为12.5MPS

上位机实现功能: 采集,显示波形,存储wave文件。

参数可运行时配置

上位机:

显示缓冲区大小可调

刷新率可调节

触发显示刷新可调节

进程守护工具

基本功能:

1. 守护进程,被守护程序崩溃后自动重启。

2. 进程输出获取,显示在编辑框中。

二进制包

openblt 烧录工具

基本功能:

1. 加载openblt 文件,下载到具有openblt bootloader 运行的单片机中。

二进制包

opencv 功能验证工具(开源项目二次开发)

基本功能:

1. 插件化图像处理流程,支持自定义图像处理流程。 2. 完善的日志和权限管理

二进制包

又一个modbus调试工具

最近混迹物联网企业,发现目前缺少一个简易可用的modbus调试工具,本软件旨在为开发者提供一个简单modbus测试工具。
主打一个代码简单易修改。
特点:

1. 基于QT5

2. 基于libmodbus

3. 三方库完全跨平台,linux/windows。

二进制包

屏幕录制工具

1. 基于QT5

2. 基于ffmpeg

3. 支持自定义录屏

源代码

开源plutosdr 板卡

1. 完全开源

2. 提高固件定制服务

3. 硬件售价450 手焊产量有线

测试数据

内部DDS回环测试

接收测试

外部发送500MHZ FM波形

硬件原理图

matlab测试

2TRX版本

大部分plutosdr应用场景都是讲plutosdr板卡作为射频收发器来使用。
实际上plutosdr板卡本身运行linux 操作系统。是具有一定脱机运算的能力。 对于一些微型频谱检测,简单射频信号收发等应用完全可以将应用层直接实现在板卡上
相较于通过网卡或者USB口传输具有更稳定,带宽更高等优点。
本开源板卡由于了SD卡启动,较原版pluto支持了自定义启动应用的功能。
提供了应用层开发SDK(编译器,buildroot文件系统)。
通过usb连接电脑,经过RNDIS驱动可以近似为通过网卡连接
(支持固件的开发定制)。

二次开发例子

``` all:
arm-linux-gnueabihf-gcc -mfloat-abi=hard --sysroot=/root/v0.32_2trx/buildroot/output/staging -std=gnu99 -g -o pluto_stream ad9361-iiostream.c -lpthread -liio -lm -Wall -Wextra -lrt
clean:
rm pluto_stream

bsdiff算法补丁生成器

1. 官方bsdiff算法例子自带bzip压缩方式

2. 本例子没有压缩,直接生成补丁文件

3. 图形化界面基于DUILIB

二进制文件

版面分析即分析出图片内的具体文件元素,如文档标题,文档内容,文档页码等,本工具基于cnstd模型

Base64 Image

. 闽ICP备19002644号