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

Spark单机模式入门:从安装到实战案例,一步步教你如何用Python玩转大数据处理

Spark单机模式实战指南Python大数据处理从入门到精通大数据处理已成为现代技术生态中不可或缺的一环而Spark作为其中的佼佼者以其卓越的性能和易用性赢得了广泛认可。对于Python开发者而言Spark的单机模式提供了一个绝佳的起点——无需复杂的基础设施投入仅需一台普通电脑就能开启大数据处理之旅。本文将带领你从零开始构建完整的Spark单机环境并通过一系列实战案例深入理解其核心概念与操作技巧。1. 环境搭建构建Spark单机开发环境1.1 系统准备与依赖安装在开始Spark之旅前确保你的系统满足以下基本要求操作系统Linux推荐Ubuntu 20.04或CentOS 7或macOS内存至少8GB处理较大数据集时建议16GB以上存储20GB可用空间JavaOpenJDK 8或11Spark 3.3要求Java 8/11/17安装Java开发工具包JDK是首要步骤# Ubuntu/Debian系统 sudo apt update sudo apt install openjdk-11-jdk -y # CentOS/RHEL系统 sudo yum install java-11-openjdk-devel -y验证Java安装是否成功java -version预期输出应显示Java版本信息如openjdk version 11.0.15 2022-04-19 OpenJDK Runtime Environment (build 11.0.1510-Ubuntu-0ubuntu0.20.04.1) OpenJDK 64-Bit Server VM (build 11.0.1510-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)1.2 Spark核心安装与配置Spark的安装过程简洁明了以下是详细步骤下载Spark发行版访问Spark官方下载页面选择预编译的Hadoop版本推荐spark-3.3.2-bin-hadoop3.tgz。解压与目录结构tar -xzf spark-3.3.2-bin-hadoop3.tgz -C /opt cd /opt mv spark-3.3.2-bin-hadoop3 spark环境变量配置编辑~/.bashrc或~/.zshrc文件添加以下内容export SPARK_HOME/opt/spark export PATH$PATH:$SPARK_HOME/bin export PYSPARK_PYTHONpython3使配置立即生效source ~/.bashrc验证安装spark-submit --version成功输出应显示Spark版本信息。1.3 Python环境配置虽然系统可能已安装Python但为了更好的依赖管理和隔离推荐使用Miniconda# 下载Miniconda安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # 执行安装 bash Miniconda3-latest-Linux-x86_64.sh安装完成后创建专用于Spark的环境conda create -n pyspark python3.9 conda activate pyspark conda install numpy pandas pyarrow -y安装PySpark包以确保版本兼容性pip install pyspark3.3.22. Spark核心概念与架构解析2.1 单机模式工作原理Spark单机模式虽然简化了分布式处理的复杂性但其核心架构仍保留了完整的设计理念Driver程序运行用户编写的应用程序如Python脚本Executor在单机模式下Driver和Executor运行在同一JVM进程中任务调度通过线程池模拟分布式任务执行这种设计使得开发者能够在本地环境中体验Spark的编程模型而无需管理复杂的集群配置。2.2 弹性分布式数据集RDDRDD是Spark最基础的数据抽象具有以下关键特性特性描述优势不可变性一旦创建便不可修改保证数据一致性分区存储数据被分割为多个分区支持并行处理容错性通过血缘关系Lineage重建丢失数据无需数据复制内存计算数据优先存储在内存中大幅提升性能创建RDD的典型方式from pyspark import SparkContext sc SparkContext(local[4], FirstApp) # 使用4个本地线程 # 从集合创建RDD data [1, 2, 3, 4, 5] rdd sc.parallelize(data, numSlices2) # 分为2个分区 # 从文本文件创建RDD text_rdd sc.textFile(data.txt, minPartitions4)2.3 转换与行动操作Spark操作分为两类理解它们的区别至关重要转换操作Transformations惰性执行仅记录操作关系返回新的RDD常见操作map(),filter(),flatMap(),groupByKey()行动操作Actions触发实际计算返回非RDD结果值或外部输出常见操作count(),collect(),saveAsTextFile(),reduce()提示频繁调用行动操作会导致重复计算合理使用persist()或cache()可以显著提升性能3. 实战案例数据处理全流程演练3.1 案例一电商用户行为分析假设我们有一份电商用户行为日志包含以下字段user_id,item_id,category_id,behavior_type,timestamp数据处理目标统计各商品类别的浏览次数找出最活跃的10个用户分析用户行为类型分布from pyspark.sql import SparkSession from pyspark.sql.functions import col, count # 初始化SparkSession spark SparkSession.builder \ .appName(EcommerceAnalysis) \ .getOrCreate() # 读取CSV数据 df spark.read.csv(user_behavior.csv, headerTrue, inferSchemaTrue) # 1. 商品类别浏览次数统计 category_stats df.groupBy(category_id) \ .agg(count(*).alias(view_count)) \ .orderBy(view_count, ascendingFalse) # 2. 最活跃用户TOP10 active_users df.groupBy(user_id) \ .agg(count(*).alias(activity_count)) \ .orderBy(activity_count, ascendingFalse) \ .limit(10) # 3. 行为类型分布 behavior_dist df.groupBy(behavior_type) \ .agg(count(*).alias(count)) \ .orderBy(count, ascendingFalse) # 结果展示 print( 商品类别浏览统计 ) category_stats.show(10) print(\n 最活跃用户TOP10 ) active_users.show() print(\n 用户行为分布 ) behavior_dist.show()3.2 案例二社交媒体文本情感分析利用Spark处理大规模文本数据结合简单的词典进行情感分析from pyspark.ml.feature import Tokenizer, StopWordsRemover from pyspark.sql.types import IntegerType # 情感词典简化版 positive_words [good, great, excellent, happy] negative_words [bad, terrible, awful, sad] def analyze_sentiment(text): pos sum(1 for word in text if word in positive_words) neg sum(1 for word in text if word in negative_words) return 1 if pos neg else (-1 if neg pos else 0) # 注册UDF spark.udf.register(sentiment_analyzer, analyze_sentiment, IntegerType()) # 示例数据 data [ (1, This product is good and works great), (2, Terrible experience, awful service), (3, Neutral comment without strong words) ] schema [id, text] df spark.createDataFrame(data, schema) # 文本预处理 tokenizer Tokenizer(inputColtext, outputColwords) df_words tokenizer.transform(df) remover StopWordsRemover(inputColwords, outputColfiltered_words) df_clean remover.transform(df_words) # 情感分析 df_result df_clean.withColumn(sentiment, expr(sentiment_analyzer(filtered_words))) # 结果展示 df_result.select(id, text, sentiment).show(truncateFalse)3.3 案例三时间序列数据分析分析某IoT设备产生的温度传感器数据from pyspark.sql.functions import window, avg, max, min # 模拟时间序列数据 data [ (sensor1, 25.3, 2023-01-01 10:00:00), (sensor1, 26.1, 2023-01-01 10:05:00), # ...更多数据... ] schema [device_id, temperature, timestamp] df spark.createDataFrame(data, schema) # 转换为时间戳类型 df df.withColumn(timestamp, col(timestamp).cast(timestamp)) # 按5分钟窗口聚合 window_agg df.groupBy( window(timestamp, 5 minutes), device_id ).agg( avg(temperature).alias(avg_temp), max(temperature).alias(max_temp), min(temperature).alias(min_temp) ) # 检测异常温度超过3倍标准差 stats df.select( avg(temperature).alias(mean), stddev(temperature).alias(std) ).collect()[0] threshold stats[mean] 3 * stats[std] anomalies df.filter(col(temperature) threshold) # 结果展示 print( 温度统计 ) window_agg.show() print(\n 异常检测 ) anomalies.show()4. 性能优化与调试技巧4.1 内存管理策略Spark单机模式下合理配置内存至关重要配置参数推荐值说明spark.driver.memory2g-4gDriver进程内存spark.executor.memory不适用单机模式下通常不设置spark.memory.fraction0.6用于执行和存储的内存比例spark.memory.storageFraction0.5存储内存占比设置方式spark SparkSession.builder \ .appName(OptimizedApp) \ .config(spark.driver.memory, 4g) \ .config(spark.memory.fraction, 0.6) \ .getOrCreate()4.2 数据分区优化合理分区能显著提升处理效率# 查看当前分区数 print(原始分区数:, rdd.getNumPartitions()) # 重新分区增加 rdd_repartitioned rdd.repartition(8) # 合并分区减少 rdd_coalesced rdd.coalesce(2) # 最佳实践 1. 每个分区处理数据量建议在128MB-1GB之间 2. 分区数通常设置为可用CPU核心数的2-3倍 3. 避免过多小分区导致调度开销 4. 避免过少大分区无法充分利用资源 4.3 常见性能瓶颈与解决方案数据倾斜现象少数任务执行时间远超其他解决方案salting技术或自定义分区器频繁磁盘IO现象大量spill to disk日志解决方案增加内存或调整spark.memory.fractionGC开销大现象GC time占比高解决方案调整JVM参数-XX:UseG1GC序列化效率低现象任务序列化时间长解决方案使用Kryo序列化# 启用Kryo序列化 conf SparkConf() \ .set(spark.serializer, org.apache.spark.serializer.KryoSerializer) \ .registerKryoClasses([MyCustomClass1, MyCustomClass2])4.4 调试与日志分析Spark提供了丰富的日志信息关键日志位置Driver日志控制台输出或$SPARK_HOME/logs目录Executor日志单机模式下与Driver日志合并常用调试技巧# 1. 检查执行计划 df.explain(extendedTrue) # 2. 缓存中间结果 intermediate df.filter(...).cache() intermediate.count() # 强制计算 # 3. 采样调试 sample df.sample(fraction0.1, seed42) sample.show() # 4. 本地模式调试 spark SparkSession.builder \ .master(local[1]) # 单线程运行便于调试 .config(spark.default.parallelism, 1) .getOrCreate()5. 进阶应用与扩展5.1 Spark SQL深度应用Spark SQL提供了强大的结构化数据处理能力# 注册临时视图 df.createOrReplaceTempView(sales) # 复杂SQL查询 top_products spark.sql( SELECT product_id, SUM(amount) as total_sales FROM sales WHERE category electronics GROUP BY product_id ORDER BY total_sales DESC LIMIT 10 ) # 自定义函数 from pyspark.sql.functions import udf from pyspark.sql.types import FloatType def calculate_profit(price, cost): return (price - cost) / price * 100 profit_udf udf(calculate_profit, FloatType()) df_with_profit df.withColumn(profit_margin, profit_udf(col(price), col(cost)))5.2 与Pandas无缝集成Spark DataFrame与Pandas DataFrame的互操作# Spark DataFrame → Pandas DataFrame pandas_df spark_df.limit(1000).toPandas() # 注意数据量大小 # Pandas DataFrame → Spark DataFrame spark_df spark.createDataFrame(pandas_df) # 使用Pandas UDF提升性能 from pyspark.sql.functions import pandas_udf pandas_udf(double) def pandas_sqrt(series: pd.Series) - pd.Series: return np.sqrt(series) df.withColumn(sqrt_value, pandas_sqrt(col(value)))5.3 机器学习管道构建使用Spark MLlib构建端到端机器学习流程from pyspark.ml import Pipeline from pyspark.ml.feature import VectorAssembler, StandardScaler from pyspark.ml.regression import RandomForestRegressor from pyspark.ml.evaluation import RegressionEvaluator # 特征工程 assembler VectorAssembler( inputCols[feature1, feature2, feature3], outputColraw_features ) scaler StandardScaler( inputColraw_features, outputColfeatures, withStdTrue, withMeanTrue ) # 模型定义 rf RandomForestRegressor( labelColtarget, numTrees100, maxDepth5 ) # 构建管道 pipeline Pipeline(stages[assembler, scaler, rf]) # 训练测试分割 train_df, test_df df.randomSplit([0.8, 0.2], seed42) # 训练模型 model pipeline.fit(train_df) # 预测与评估 predictions model.transform(test_df) evaluator RegressionEvaluator(labelColtarget) rmse evaluator.evaluate(predictions, {evaluator.metricName: rmse}) print(fRoot Mean Squared Error: {rmse:.2f})5.4 流处理应用开发Spark Structured Streaming实时处理示例from pyspark.sql.functions import from_json, col from pyspark.sql.types import StructType, StructField, StringType, DoubleType # 定义输入数据模式 schema StructType([ StructField(timestamp, StringType()), StructField(device_id, StringType()), StructField(temperature, DoubleType()) ]) # 创建流式DataFrame stream_df spark \ .readStream \ .format(kafka) \ .option(kafka.bootstrap.servers, localhost:9092) \ .option(subscribe, sensor_data) \ .load() \ .select(from_json(col(value).cast(string), schema).alias(data)) \ .select(data.*) # 实时处理逻辑 processed_stream stream_df \ .withWatermark(timestamp, 5 minutes) \ .groupBy( window(timestamp, 10 minutes, 5 minutes), device_id ) \ .agg(avg(temperature).alias(avg_temp)) # 输出结果到控制台 query processed_stream \ .writeStream \ .outputMode(update) \ .format(console) \ .option(truncate, False) \ .start() query.awaitTermination()在实际项目中我发现合理使用cache()和unpersist()能显著提升复杂作业的性能。例如当一个RDD或DataFrame会被多次使用时先缓存它能避免重复计算而在不再需要时及时释放内存可以避免不必要的内存压力。这种精细化的内存管理在资源受限的单机环境中尤为重要。

相关文章:

Spark单机模式入门:从安装到实战案例,一步步教你如何用Python玩转大数据处理

Spark单机模式实战指南:Python大数据处理从入门到精通 大数据处理已成为现代技术生态中不可或缺的一环,而Spark作为其中的佼佼者,以其卓越的性能和易用性赢得了广泛认可。对于Python开发者而言,Spark的单机模式提供了一个绝佳的起…...

5个高效技巧:彻底清理Windows驱动冗余,释放系统空间终极指南

5个高效技巧:彻底清理Windows驱动冗余,释放系统空间终极指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 还在为Windows系统盘空间不足而烦恼吗?D…...

039、从改进到创新:构建自定义YOLO变体的设计思维

一、从一次深夜调试说起 上周在部署YOLO到边缘设备时遇到个怪事:白天测试mAP还有78.3%,晚上同样的模型、同样的测试集,掉到了72.1%。排查了三小时,最后发现是某个卷积层的输出通道数设置成了奇数——硬件加速器对某些形状的内存对…...

【JVM深度解析】第26篇:CAS、AQS与并发工具类原理

摘要 CAS(Compare-And-Swap)和 AQS(AbstractQueuedSynchronizer)是 Java 并发包的基石。CAS 通过硬件支持的原子指令实现无锁并发,AQS 通过模板模式封装了线程等待和唤醒的通用逻辑。本文深入解析 CAS 的底层实现&…...

【限时解密】2026奇点大会未公开PPT核心页:5大AI根因分析失效场景及防御性编码清单

第一章:2026奇点智能技术大会:AI代码根因分析 2026奇点智能技术大会(https://ml-summit.org) 本届大会首次将“AI代码根因分析”列为独立技术轨道,聚焦大模型驱动的自动化缺陷定位、语义级错误溯源与跨栈因果推理。不同于传统日志分析或符号…...

2026 年 5 大编程网站深度对比:零基础到就业,谁才是自学首选?

引言:自学编程的崛起与平台的抉择 在数字浪潮的推动下,编程自学已成为许多人迈向IT行业的首选路径。据《2025年在线教育趋势报告》显示,全球有超过60%的编程学习者倾向于通过线上平台进行自学。然而,从“零基础”到“成功就业”的…...

KS-Downloader:专业级快手无水印视频下载解决方案

KS-Downloader:专业级快手无水印视频下载解决方案 【免费下载链接】KS-Downloader 快手(KuaiShou)视频/图片下载工具;数据采集工具 项目地址: https://gitcode.com/gh_mirrors/ks/KS-Downloader 还在为无法保存喜欢的快手视…...

【JVM深度解析】第25篇:volatile与synchronized深度原理

摘要 volatile 和 synchronized 是 Java 并发编程中最常用的两个关键字,但它们的底层原理却大不相同。volatile 通过内存屏障保证可见性和有序性(无原子性),synchronized 通过监视器锁保证原子性、可见性和有序性。本文深入解析两…...

上交大与清华等突破:AI实现数据库自动技能扩展准确率提升突破

这项由上海交通大学主导,联合清华大学、新加坡国立大学以及蚂蚁集团共同开展的研究,发表于2026年6月的ACM数据管理顶级期刊《Proceedings of the ACM on Management of Data》第4卷第3期(SIGMOD 2026),论文编号为Artic…...

BaiduPCS-Go 终极指南:高效命令行管理百度网盘的完整方案

BaiduPCS-Go 终极指南:高效命令行管理百度网盘的完整方案 【免费下载链接】BaiduPCS-Go iikira/BaiduPCS-Go原版基础上集成了分享链接/秒传链接转存功能 项目地址: https://gitcode.com/GitHub_Trending/ba/BaiduPCS-Go 还在为百度网盘的下载限速而烦恼&…...

3个技术方案解决米哈游游戏启动器的核心痛点:Starward架构解析

3个技术方案解决米哈游游戏启动器的核心痛点:Starward架构解析 【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward 对于同时游玩《原神》、《崩坏:星穹铁道》、《绝区零…...

机器人算法实战:用Python实现S形速度规划中的二分法与牛顿法(附完整代码)

机器人算法实战:用Python实现S形速度规划中的二分法与牛顿法 在工业机器人轨迹规划中,S形速度曲线因其加速度连续的特性,能有效减少机械冲击和振动。但实现完美的S形曲线规划,核心难点往往在于求解满足位移约束的非线性方程。本文…...

从零到一:手把手教你用国产化7K325T板卡搭建PCIe数据采集系统(含FMC子卡选型指南)

从零到一:手把手教你用国产化7K325T板卡搭建PCIe数据采集系统(含FMC子卡选型指南) 第一次拿到这块国产化7K325T板卡时,我盯着那个HPC规格的FMC接口看了半天——这个看似普通的连接器背后,藏着构建高性能数据采集系统的…...

零基础实战:用Clawdbot将Qwen3-VL:30B接入飞书,打造企业智能助手

零基础实战:用Clawdbot将Qwen3-VL:30B接入飞书,打造企业智能助手 1. 准备工作与环境确认 1.1 硬件环境检查 在开始前,请确保您的星图AI云实例满足以下最低配置要求: 组件最低要求推荐配置GPU显存24GB48GBCPU核心数8核20核系统…...

Unity UGUI Dropdown向上展开?一个Pivot和Anchor的调整就搞定(附完整C#代码)

Unity UGUI Dropdown向上展开的终极解决方案:Pivot与Anchor深度解析 在Unity的UI开发中,Dropdown组件是构建交互式菜单的常用工具。但当你需要在屏幕底部放置一个下拉菜单时,可能会遇到一个令人头疼的问题——默认向下展开的Dropdown列表会被…...

2025届学术党必备的十大AI辅助论文工具解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于大语言模型的智能写作辅助系统,是专为学术研究者设计的AI开题报告工具&#…...

新加坡求职股权激励介绍(股票期权Stock Options / ESOP、行权价Strike Price、限制性股票RSU、Phantom Shares虚拟股权)

文章目录新加坡求职必看:一文搞懂公司股权激励(股票小白入门)一、什么是股权激励?二、常见的三种股权形式(重点)1️⃣ 股票期权(Stock Options / ESOP)2️⃣ 限制性股票(…...

元数据管理难实现?看这一篇就足够

很多企业一提到元数据管理,第一反应都是平台、架构、上云、同步、治理,听起来方向都对,但真正推进起来,往往很容易卡住。系统越来越多,数据源越来越杂,链路一拉长,数据到底从哪来、被谁加工、给…...

【全网唯一国奖版】2026妈妈杯(MathorCup)C题中老年人群高血脂症的风险预警及干预方案优化高质量成品论文

💥💥💞💞欢迎阅读本文 ❤️❤️💥💥 🏆博主优势:🌞🌞🌞博文尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&#x…...

为什么92%的团队误判AI编码成本?3步穿透LLM幻觉层、Token开销、隐性重构成本(含审计SOP模板)

第一章:智能代码生成与代码成本分析 2026奇点智能技术大会(https://ml-summit.org) 现代软件工程正经历一场由大语言模型驱动的范式迁移:代码不再仅由开发者逐行书写,而是由上下文感知的智能体协同生成、验证与优化。与此同时,“…...

D3KeyHelper暗黑3宏工具完整指南:5分钟掌握游戏自动化终极技巧

D3KeyHelper暗黑3宏工具完整指南:5分钟掌握游戏自动化终极技巧 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 你是否厌倦了在暗黑破坏神…...

通用人工智能(AGI)与当前大模型的本质区别(2024权威白皮书级对比:自主目标生成、跨域因果推理、元认知闭环)

第一章:通用人工智能(AGI)与当前大模型的本质区别 2026奇点智能技术大会(https://ml-summit.org) 通用人工智能(AGI)指具备跨领域自主推理、目标建模、持续学习与具身适应能力的系统,其认知架构不依赖于海…...

3步解决方案:G-Helper快速修复华硕ROG笔记本屏幕色彩异常问题

3步解决方案:G-Helper快速修复华硕ROG笔记本屏幕色彩异常问题 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, St…...

从Transformer到Turing++:AGI技术路线图深度拆解(含12个被低估的底层瓶颈:世界模型稀疏性、跨模态信用分配、反事实因果引擎)

第一章:AGI技术路线图:从当前AI到通用智能 2026奇点智能技术大会(https://ml-summit.org) 当前人工智能系统在特定任务上已展现出超越人类的表现,但其本质仍是窄域智能(Narrow AI)——依赖大量标注数据、固定分布假设…...

别再手动点STK了!用MATLAB的ExecuteCommand批量生成AER和可见性报告(附完整代码)

用MATLAB自动化STK报告生成:从单次操作到批量处理的进阶指南 每次在STK软件里重复点击生成报告的操作,是不是已经让你感到疲惫不堪?想象一下,当你需要为20颗卫星和15个地面站生成数百份AER和可见性报告时,手动操作不仅…...

Redis 集群迁移与 Slot 重分配机制

Redis作为高性能的内存数据库,其集群模式通过分片(Slot)机制实现数据分布式存储。随着业务增长或节点调整,集群迁移与Slot重分配成为运维关键。本文将深入解析这一机制,帮助读者掌握动态扩缩容与故障恢复的核心技术。 …...

终极指南:如何用RL4CO快速解决复杂组合优化问题

终极指南:如何用RL4CO快速解决复杂组合优化问题 【免费下载链接】rl4co A PyTorch library for all things Reinforcement Learning (RL) for Combinatorial Optimization (CO) 项目地址: https://gitcode.com/gh_mirrors/rl/rl4co 你是否曾为物流配送路线规…...

华硕笔记本终极性能优化指南:GHelper完全配置教程

华硕笔记本终极性能优化指南:GHelper完全配置教程 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, …...

通往通用智能的终极路线图(2024-2035关键里程碑白皮书):含7项核心能力演进指标与国家级AGI投入对比数据

第一章:AGI技术路线图:从当前AI到通用智能 2026奇点智能技术大会(https://ml-summit.org) 当前人工智能系统在特定任务上已展现出超越人类的性能,但其本质仍是窄域、静态、数据密集型的模式匹配工具。迈向通用人工智能(AGI&#…...

基于AXI总线的Cortex-M3软核SoC设计与外设集成

1. Cortex-M3软核与AXI总线基础解析 第一次接触Cortex-M3软核是在三年前的一个物联网安全项目,当时需要在FPGA上实现一个轻量级加密处理器。和大多数嵌入式开发者一样,我之前主要使用现成的STM32系列芯片,直到真正动手在Vivado里搭建M3软核&a…...