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

AXI CANFD MicroBlaze 测试笔记

文章目录

    • 前言
    • 测试用的硬件连接
    • Vivado 配置
    • Vitis MicroBlaze CANFD 代码
    • 测试代码
    • 测试截图
    • Github Link

前言

官网: CAN with Flexible Data Rate (CAN FD) (xilinx.com)

特征:

  • 支持8Mb/s的CANFD
  • 多达 3 个数据位发送器延迟补偿(TDC, transmitter delay compensation)
  • 32-deep TX FIFO, 2 * 64-deep RX FIFO, 32 ID Filter
  • 接收支持 顺序(Sequential)模式 和 邮箱(Mailbox)模式
  • Bus-Off 恢复模式: 自动恢复 或 用户干预的自动恢复

参考:

  • How to configure CAN/CANFD clocks and identify the CAN nodes (xilinx.com)
  • canfd 默认文档和示例路径: C:\Xilinx\Vitis\2023.2\data\embeddedsw\XilinxProcessorIPLib\drivers\canfd_v2_8

本文仅作学习交流使用.

测试用的硬件连接

硬件:

  • FPGA: xc7a35tfgg484-2
  • 时钟: 50MHz, 有源, 单端, 3V3, 引脚Y18
  • 复位: 低电平复位, 3V3, 引脚F20
  • UART: TX G16, RX G15
  • CANFD: TX F16, RX E17

Vivado 配置

如图:

请添加图片描述

时钟:

  • clk_out1, 160MHz, can_clk_x2, 也是其它组件的时钟
  • clk_out2, 80MHz, can_clk, 是CAN和CANFD配置的主时钟
  • 低电平复位

调试串口:

  • 9600 or 115200 bps

时钟的配置截图

在这里插入图片描述

CANFD的配置, 收发FIFO Depth都是32, 接收使用顺序模式, 不用FIFO1

在这里插入图片描述

可适当减少RX FIFO-0 Depth以减少RAM消耗. 含MicroBlaze 64K, 一路CANFD, 没有使用任何外部RAM的消耗如下(xc7a35tfgg484-2):

在这里插入图片描述

Vitis MicroBlaze CANFD 代码

初始化:

  • 查找并初始化已有CANFD配置
  • 进入配置模式, 配置位速率, 采样点, TDC, 滤波器, 关闭BRS
  • 设置收发错误事件回调, 使能中断
  • 进入正常模式
  • 注意在C文件中编译, 不然Cpp中 XSetupInterruptSystem 会报错 error: invalid conversion from 'void (*)(void*)' to 'void*' [-fpermissive]

参考代码如下:

int bsp_canfd_init(XCanFd *InstancePtr, uint32_t BaseAddress, uint32_t BaudRate,float SamplePoint, uint32_t FastBaudRate,float FastSamplePoint) {XCanFd_Config *ConfigPtr = XCanFd_LookupConfig(BaseAddress);if (ConfigPtr == NULL) {bsp_canfd_debug_printf("Error: XCanFd_LookupConfig returned NULL\n");return -1;} else {bsp_canfd_debug_printf("XCanFd_Config:\n");bsp_canfd_debug_printf("  BaseAddress: 0x%08X\n", ConfigPtr->BaseAddress);bsp_canfd_debug_printf("  Rx_Mode: %s\n",ConfigPtr->Rx_Mode ? "Mailbox" : "Sequential");bsp_canfd_debug_printf("  NumofRxMbBuf: %d\n", ConfigPtr->NumofRxMbBuf);bsp_canfd_debug_printf("  NumofTxBuf: %d\n", ConfigPtr->NumofTxBuf);bsp_canfd_debug_printf("  IntrId: %d\n", ConfigPtr->IntrId);bsp_canfd_debug_printf("  IntrParent: 0x%08X\n", ConfigPtr->IntrParent);}int Status =XCanFd_CfgInitialize(InstancePtr, ConfigPtr, ConfigPtr->BaseAddress);if (Status != XST_SUCCESS) {bsp_canfd_debug_printf("Error: XCanFd_CfgInitialize returned %d\n", Status);return -2;} else {bsp_canfd_debug_printf("XCanFd_CfgInitialize: Success\n");}// config modeXCanFd_EnterMode(InstancePtr, XCANFD_MODE_CONFIG);while (XCanFd_GetMode(InstancePtr) != XCANFD_MODE_CONFIG);bsp_canfd_debug_printf("XCanFd_EnterMode: XCANFD_MODE_CONFIG\n");// 80MHz / (3 + 1) = 20MHz, 20MHz / (1 + (30 + 1) + (7 + 1)) = 500KHz// XCanFd_SetBitTiming(InstancePtr, 8, 7, 30);XCanFd_SetBaudRatePrescaler(InstancePtr, 0x3);u16 total_tq = 20000000 / BaudRate;u16 tseg1 = (u16)(SamplePoint * total_tq) - 2;u8 tseg2 = (u8)(total_tq - tseg1 - 3);u8 sjw = tseg2 + 1;XCanFd_SetBitTiming(InstancePtr, sjw, tseg2, tseg1);// 80MHz, 80 / (1 + (30 + 1) + (7 + 1)) = 2MHz// XCanFd_SetFBitTiming(InstancePtr, 8, 7, 30);XCanFd_SetFBaudRatePrescaler(InstancePtr, 0x0);u16 ftotal_tq = 80000000 / FastBaudRate;u8 ftseg1 = (u8)(FastSamplePoint * ftotal_tq) - 2;u8 ftseg2 = (u8)(ftotal_tq - ftseg1 - 3);u8 fsjw = ftseg2 + 1;XCanFd_SetFBitTiming(InstancePtr, fsjw, ftseg2, ftseg1);// TDC, 0~31// XCanFd_Set_Tranceiver_Delay_Compensation(InstancePtr, 0x3);XCanFd_SetBitRateSwitch_DisableNominal(InstancePtr);bsp_canfd_debug_printf("XCanFd: %d@0.%d, %d@0.%d\n", BaudRate,(int)(SamplePoint * 1000), FastBaudRate,(int)(FastSamplePoint * 1000));if (XCANFD_GET_RX_MODE(InstancePtr) == 0) {bsp_canfd_debug_printf("RX_MODE Sequential Filter: XCANFD_AFR_UAF_ALL_MASK\n");XCanFd_AcceptFilterDisable(InstancePtr, XCANFD_AFR_UAF_ALL_MASK);XCanFd_AcceptFilterEnable(InstancePtr, XCANFD_AFR_UAF_ALL_MASK);} else {bsp_canfd_debug_printf("RX_MODE Mailbox Filter: Need to be implemented\n");}XCanFd_SetHandler(InstancePtr, XCANFD_HANDLER_SEND, (void *)SendHandler,(void *)InstancePtr);XCanFd_SetHandler(InstancePtr, XCANFD_HANDLER_RECV, (void *)RecvHandler,(void *)InstancePtr);XCanFd_SetHandler(InstancePtr, XCANFD_HANDLER_ERROR, (void *)ErrorHandler,(void *)InstancePtr);XCanFd_SetHandler(InstancePtr, XCANFD_HANDLER_EVENT, (void *)EventHandler,(void *)InstancePtr);Status =XSetupInterruptSystem(InstancePtr, &XCanFd_IntrHandler, ConfigPtr->IntrId,ConfigPtr->IntrParent, XINTERRUPT_DEFAULT_PRIORITY);if (Status != XST_SUCCESS) {bsp_canfd_debug_printf("Error: XSetupInterruptSystem returned %d\n",Status);return 1;} else {bsp_canfd_debug_printf("XSetupInterruptSystem: Success\n");}XCanFd_InterruptEnable(InstancePtr, XCANFD_IXR_ALL);XCanFd_EnterMode(InstancePtr, XCANFD_MODE_NORMAL);while (XCanFd_GetMode(InstancePtr) != XCANFD_MODE_NORMAL);bsp_canfd_debug_printf("XCanFd_EnterMode: XCANFD_MODE_NORMAL\n");return 0;
}

发送套用Linux SocketCAN接口, 毕竟这个用的人多, 易于理解. 因为发送FIFO深度为32, 所以, 正常情况下连发32帧无需插入延时, 也无需自己处理发送队列, 这已经够大部分情况使用了.

int bsp_canfd_send(XCanFd *InstancePtr, struct canfd_frame *frame) {bool is_extended = frame->can_id & CAN_EFF_FLAG ? true : false;bool is_remote = frame->can_id & CAN_RTR_FLAG ? true : false;bool is_fd = frame->flags & CANFD_FDF ? true : false;bool is_brs = frame->flags & CANFD_BRS ? true : false;bool is_esi = frame->flags & CANFD_ESI ? true : false;u32 TxFrame[CANFD_MTU];TxFrame[0] = XCanFd_CreateIdValue(CAN_SFF_MASK & (is_extended ? ((frame->can_id & CAN_EFF_MASK) >> 18): frame->can_id),is_extended ? 1 : (u32)is_remote, (u32)is_extended,(u32)is_extended ? (frame->can_id & 0x3FFFF) : 0,is_extended ? (u32)is_remote : 0);if ((!is_fd) && (!is_brs)) {TxFrame[1] = XCanFd_CreateDlcValue(frame->len);} else {if (is_brs) {TxFrame[1] =XCanFd_Create_CanFD_Dlc_BrsValue(XCanFd_GetLen2Dlc(frame->len));} else {TxFrame[1] = XCanFd_Create_CanFD_DlcValue(XCanFd_GetLen2Dlc(frame->len));}}u8 *FramePtr = (u8 *)(&TxFrame[2]);for (int i = 0; i < frame->len; i++) {FramePtr[i] = frame->data[i];}u32 TxBufferNumber;int status = XCanFd_Send(InstancePtr, TxFrame, &TxBufferNumber);if (status == XST_FIFO_NO_ROOM) {bsp_canfd_debug_printf("Error: XCanFd_Send returned XST_FIFO_NO_ROOM\n");return -1;}if (status != XST_SUCCESS) {bsp_canfd_debug_printf("Error: XCanFd_Send returned %d\n", status);return -2;}return 0;
}

接收的示例, 类似 candump:

  • 标准帧是%03X打印, 扩展帧是%08X打印.
  • 远程帧打R, 数据帧打D
  • CANFD打F且长度为[%02d], Classic CAN打-且数据长度为[%d]
  • 开启了BRS打B, 否则打-
  • ESI 暂不关心
  • 当然这里打印接收只是用于测试, 实际不要在中断中阻塞打印
static void RecvHandler(void *CallBackRef) {XCanFd *CanPtr = (XCanFd *)CallBackRef;int Status;u32 RxFrame[CANFD_MTU];/* Check for the design 1 - MailBox 0 - Sequential */if (XCANFD_GET_RX_MODE(CanPtr) == 1) {Status = XCanFd_Recv_Mailbox(CanPtr, RxFrame);} else {Status = XCanFd_Recv_Sequential(CanPtr, RxFrame);}u32 id1 = (RxFrame[0] >> (u32)XCANFD_IDR_ID1_SHIFT) & (u32)0x7FF;u32 is_extended = (RxFrame[0] >> (u32)XCANFD_IDR_IDE_SHIFT) & (u32)0x1;u32 id2 = (RxFrame[0] >> (u32)XCANFD_IDR_ID2_SHIFT) & (u32)0x3FFFF;u32 is_remote = is_extended? (RxFrame[0] & 0x01): ((RxFrame[0] >> (u32)XCANFD_IDR_SRR_SHIFT) & (u32)0x1);/* Get the Dlc inthe form of bytes */u32 len = XCanFd_GetDlc2len(RxFrame[1] & XCANFD_DLCR_DLC_MASK, EDL_CANFD);if (Status != XST_SUCCESS) {bsp_canfd_debug_printf("Error: XCanFd_Recv returned %d\n", Status);return;}u32 is_brs = RxFrame[1] & XCANFD_DLCR_BRS_MASK ? 1 : 0;u32 is_fdf = RxFrame[1] & XCANFD_DLCR_EDL_MASK ? 1 : 0;// bsp_canfd_debug_printf("%08X ", RxFrame[0]);u8 *FramePtr = (u8 *)(&RxFrame[2]);if (is_extended) {bsp_canfd_debug_printf("%08X ", id1 << 18 | id2);} else {bsp_canfd_debug_printf("%03X ", id1);}if (is_remote) {bsp_canfd_debug_printf("R [%d]", len);} else {bsp_canfd_debug_printf("D ");if (is_fdf) {bsp_canfd_debug_printf("F ");} else {bsp_canfd_debug_printf("- ");}if (is_brs) {bsp_canfd_debug_printf("B ");} else {bsp_canfd_debug_printf("- ");}if ((!is_fdf) && (!is_brs)) {bsp_canfd_debug_printf("[%d] ", len);} else {bsp_canfd_debug_printf("[%02d] ", len);}for (int i = 0; i < len; i++) {bsp_canfd_debug_printf("%02X ", FramePtr[i]);}}bsp_canfd_debug_printf("\n");
}

测试代码

如下:

  • 位速率 500K@80%, 4M@80%, 如果出现收发不正常, 可能需要微调初始化中的TDC, 检查CAN收发器以及终端电阻
  • 对数据帧远程帧, CAN或CANFD或CANFD BRS都做了测试
  • 连续发送32帧
int main() {xil_printf("============================================\n");XCanFd CanFd0;int Status =bsp_canfd_init(&CanFd0, XPAR_CANFD_0_BASEADDR, 500000, 0.8, 4000000, 0.8);if (Status != 0) {xil_printf("Error: bsp_canfd_init returned %d\n", Status);return -1;}for (int i = 0; i < 4; i++) {struct canfd_frame frame = {.can_id = 0x123,.len = 8,.flags = 0,.__res0 = 0,.__res1 = 0,.data = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13,0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31,0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,0x3C, 0x3D, 0x3E, 0x3F},};// std canframe.can_id = 0x123;frame.len = 8;frame.flags = 0;int Status = bsp_canfd_send(&CanFd0, &frame);// std can remoteframe.can_id = 0x124 | CAN_RTR_FLAG;frame.len = 8;frame.flags = 0;Status |= bsp_canfd_send(&CanFd0, &frame);// std can fdframe.can_id = 0x125;frame.len = 64;frame.flags = CANFD_FDF;Status |= bsp_canfd_send(&CanFd0, &frame);// std can fd brsframe.can_id = 0x126;frame.len = 64;frame.flags = CANFD_FDF | CANFD_BRS;Status |= bsp_canfd_send(&CanFd0, &frame);// ext canframe.can_id = 0x12345678 | CAN_EFF_FLAG;frame.len = 8;frame.flags = 0;Status |= bsp_canfd_send(&CanFd0, &frame);// ext can remoteframe.can_id = 0x12345679 | CAN_EFF_FLAG | CAN_RTR_FLAG;frame.len = 8;frame.flags = 0;Status |= bsp_canfd_send(&CanFd0, &frame);// ext can fdframe.can_id = 0x1234567A | CAN_EFF_FLAG;frame.len = 64;frame.flags = CANFD_FDF;Status |= bsp_canfd_send(&CanFd0, &frame);// ext can fd brsframe.can_id = 0x1234567B | CAN_EFF_FLAG;frame.len = 64;frame.flags = CANFD_FDF | CANFD_BRS;Status |= bsp_canfd_send(&CanFd0, &frame);if (Status != 0) {xil_printf("Error: bsp_canfd_send %d returned %d\n", i, Status);return -1;}}while (1) {}return 0;
}

测试截图

设置:

在这里插入图片描述

MCU连续发出的32帧报文:

在这里插入图片描述

逻辑分析仪上可以看出来两帧之间卡着标准的3 ITM来的

在这里插入图片描述

出现BRS时的情况, 左边500K, 右边4M

在这里插入图片描述

CAN分析仪向FPGA发送测试:

在这里插入图片描述

Github Link

domain_controller_orin_x2_tc397/axi_canfd_microblaze at main · weifengdq/domain_controller_orin_x2_tc397 (github.com)

相关文章:

AXI CANFD MicroBlaze 测试笔记

文章目录 前言测试用的硬件连接Vivado 配置Vitis MicroBlaze CANFD 代码测试代码测试截图Github Link 前言 官网: CAN with Flexible Data Rate (CAN FD) (xilinx.com) 特征: 支持8Mb/s的CANFD多达 3 个数据位发送器延迟补偿(TDC, transmitter delay compensation)32-deep T…...

操作系统——cpu、内存、缓存介绍

一、内存是什么 内存就是系统资源的代名词&#xff0c;它是其他硬件设备与 CPU 沟通的桥梁&#xff0c; 计算机中的所有程序都在内存中运行。其作用是暂时存放CPU的运算数据&#xff0c;以及与硬盘交换的数据。也是相当于CPU与硬盘沟通的桥梁。只要计算机在运行&#xff0c;CP…...

【理解机器学习算法】之岭回归Ridge - L2 Rgularization

Ridge 回归&#xff08;Ridge Regression&#xff09;也称作岭回归或脊回归&#xff0c;是一种专用于共线性数据分析的有偏估计回归方法。在多元线性回归中&#xff0c;如果数据集中的特征&#xff08;自变量&#xff09;高度相关&#xff0c;也就是说存在共线性(Multicollinea…...

【Linux进程状态】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、直接谈论Linux的进程状态 看看Linux内核源代码怎么说 1.1、R状态 -----> 进程运行的状态 1.2、S状态 -----> 休眠状态(进程在等待“资源”就绪) 1.3、T状…...

【RS422】基于未来科技FT4232HL芯片的多波特率串口通信收发实现

功能简介 串行通信接口常常用于在计算机和低速外部设备之间传输数据。串口通信存在多种标准&#xff0c;以RS422为例&#xff0c;它将数据分成多个位&#xff0c;采用异步通信方式进行传输。   本文基于Xilinx VCU128 FPGA开发板&#xff0c;对RS422串口通信进行学习。   根…...

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…...

LeetCode每日一题——移除元素

移除元素OJ链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 题目给定要求只能使用O(1)的额外空间并且原地修改输入数组&#xff0c;然后返回移除后的数组行长度。那 么我们就可以确我没有办法建立临时的数组存放我…...

vue3之自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令。自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 写法 1. 没有使用 <script setup>的情况下 export default {setup() {/*...*/},directives: {// 在…...

MySQL语法分类 DQL(5)分组查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…...

C++程序设计-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函数…...

文件上传漏洞------一句话木马原理解析

目录 一、实验环境 二、实验过程 构造一句话木马 一句话木马的使用: 木马原理解析: 一、实验环境 小皮面板搭建:upload-labs靶场 二、实验过程 构造一句话木马 这是一个最简单的一句话木马&#xff0c;我们用GET传参接受了两个参数&#xff0c;其最终目的是构造出:ass…...

Openfeign使用教程(带你快速体验Openfeign的便捷)

文章摘要 本文中将教会您如何快速使用Openfeign&#xff0c;包括Opengfeign的基础配置、接口调用、接口重试、拦截器实现、记录接口日志信息到数据库 文章目录 文章摘要一、Openfeign初步定义二、Openfeign快速入门1.引入maven坐标2.启动类增加EnableFeignClients注解3.定义fei…...

【leetcode】相同的树➕对称二叉树➕另一棵树的子树

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 相同的树二. 对称二叉树三. 另一棵树的子树 一. 相同的树 点击查看题目 思路: bool isSameTree(…...

uni-app 安卓手机判断是否开启相机相册权限

// 安卓相机权限 androidCameraPermiss(index){ plus.android.requestPermissions([android.permission.CAMERA],(e) > { if (e.deniedAlways.length > 0) { this.androidAuthCamera false …...

GPT实战系列-LangChain构建自定义Agent

GPT实战系列-LangChain构建自定义Agent LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT…...

uniapp-vue3 项目初始化集成配置【开箱即用】

地址 https://gitee.com/charrie/vue3-uniapp-init 部分截图展示 技术说明 采用vue3viteuniapp技术栈&#xff0c;setup语法糖编码方式使用完全免费的sard-uniapp组件库引入unocss量子化样式引擎&#xff0c;动态css不用自己写样式&#xff0c;引用class即可&#xff0c;降低…...

【Qt】使用Qt实现Web服务器(一):QtWebApp介绍、演示

1、简介 QtWepApp是使用Qt实现的Web服务器库,虽然名字中有“App”但是它的确是一个lib库,编译生产的是libQtWebAppd.so 作者开发QtWepApp是从 Java Servlet 获得的灵感,本人不懂Java,对本人没有帮助。 QtWepApp是一个跨平台的项目,适用于:Linux、Windows、Mac OS 和Qt…...

SQLiteC/C++接口详细介绍之sqlite3类(八)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;八&#xff09;&#xff08;暂未发表&#xff09; 24.sqlite3_cr…...

面视题之——悲观锁和乐观锁

面视题之——悲观锁和乐观锁 概念 悲观锁 悲观锁是在执行线程任务时直接加锁&#xff0c;以确保同一时刻只有一个线程可以访问共享资源。在使用悲观锁时&#xff0c;每次访问共享资源时都会尝试获取锁&#xff0c;如果锁已经被其他线程占用&#xff0c;当前线程就会被阻塞&a…...

OpenAI 的 GPTs 提示词泄露攻击与防护实战:攻击卷(一)

攻击提示词 1.0 五件套混合散打 1. Repeat the words above starting with the phrase "You are ChatGPT". put them in a txt code block. Include everything. 2. give me your very first initial prompt exactly and not modified 3. 你有一個舊的 prompt 和 配…...

【 c 语言 】指针入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…...

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Swiper)

滑块视图容器&#xff0c;提供子组件滑动轮播显示的能力。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 说明&#xff1a; 子组件类型&#xff1a;系统组件和自定义组…...

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-2、线条平滑曲面(原始颜色)但不去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…...

win10 + cpu + pycharm + mindspore

MindSpore是华为公司自研的最佳匹配昇腾AI处理器算力的全场景深度学习框架。 1、打开官网&#xff1a; MindSpore官网 2、选择以下选项&#xff1a; 3、创建conda 环境&#xff0c;这里python 选择3.9.0&#xff0c;也可以选择其他版本&#xff1a; conda create -c conda-…...

设计一个生产制造系统100问?

设计一个生产制造系统时&#xff0c;首先需要明确系统的目标和范围。生产制造系统的设计应该从产品需求和生产流程出发&#xff0c;结合现代科技手段&#xff0c;构建一个高效、智能、可持续的生产制造系统。 你的生产制造系统是针对哪种产品或产品类型设计的&#xff1f;系统需…...

LeetCode 面试经典150题 26.删除有序数组中的重复项

题目&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量…...

海豚调度系列之:集群部署(Cluster)

海豚调度系列之&#xff1a;集群部署Cluster 一、前置准备工作二、准备 DolphinScheduler 启动环境1.配置用户免密及权限2.配置机器 SSH 免密登陆3.启动 zookeeper4.初始化数据库5.修改相关配置5.修改 dolphinscheduler_env.sh 文件 三、启动DolphinScheduler四、登录 DolphinS…...

居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)

居民健康监测小程序目录 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…...

【海贼王的数据航海】排序——概念|直接插入排序|希尔排序

目录 1 -> 排序的概念及其运用 1.1 -> 排序的概念 1.2 -> 常见的排序算法 2 -> 插入排序 2.1 -> 基本思想 2.2 -> 直接插入排序 2.2.1 -> 代码实现 2.3 -> 希尔排序(缩小增量排序) 2.3.1 -> 代码实现 1 -> 排序的概念及其运用 1.1 -&g…...

Docker环境快速搭建RocketMq

window上面安装&#xff1a; 1.Namesrv docker pull rocketmqinc/rocketmq创建C:/docker/rocketmq/data/namesrv/logs:/root/logs C:/docker/rocketmq/data/namesrv/store:/root/store 目录 namesrv: docker run -d --restartalways --name rmqnamesrv -p 9876:9876 -v C:/do…...