arduino - 用 arduino zero 开发板来学习理解arduino软件编程细节

文章目录

    • arduino - 用 arduino zero 开发板来学习理解arduino软件编程细节
    • 概述
    • 笔记
    • 实验环境
    • 不是所有的arduino工程都能在同一块开发板上编译过
    • 为啥arduino编程都是在setup()和loop()函数中实现代码?
    • END

arduino - 用 arduino zero 开发板来学习理解arduino软件编程细节

概述

手头有个固件, 使用了arduino Mega2560 开发板来做控制.
但是我是arduino新手, Mega2560并不能做单步调试. 光看代码不管用啊, 要单步调试才能深入理解代码实现逻辑.
整了一块arduino zero开发板, 可以在 Arduino IDE 单步调试, 这就好多了.
单步调试后, 通过实验, 就可以理解很多arduino编程的细节问题了.

笔记

实验环境

Arduino IDE 2.0.3 + arduino zero

不是所有的arduino工程都能在同一块开发板上编译过

每块开发板都包含了特定的库, 可能这个库由于MCU的原因(e.g. AVR MCU vs ARM M0 MCU), 并没有包含进开发板的库, 导致编译不过.
e.g. _delay_loop_2 声明在 util/delay_basic.h 中, 头文件路径为 C:\Users\me\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\util

在mega2560开发板的工程上, 可以看到为了延时, 调用_delay_loop_2()
但是arduino zero是ARM M0的MCU, 所以就没有这个函数. 需要看官方例子, 找到延时函数, 进行替代.
打开官方例子工程, 将板子选为arduino zero, 打开有延时操作的例子, e.g. Blink工程, 单步delay()函数, 在实验里面, 可以看到微妙延时的函数. delayMicroseconds(), 替换掉就好.

还有些寄存器定义, 是和MCU相关的. e.g. SREG 这个在avr MCU中才有, 在ARM MCU中是没有的, 这就移植不了, 只能在mega2560或arduino nano every上运行. 因为这2款开发板不能单步, 只能用arduino zero模拟运行(将编译不过的实现注释掉), 将实现逻辑理清楚. 然后在avr mcu 的板子上实际测试.

为啥arduino编程都是在setup()和loop()函数中实现代码?

这个单步一下就知道, 先在setup()和loop()入口下断点, 跑起来, 单步出了这2个函数就看到了.

/*Copyright (c) 2015 Arduino LLC.  All right reserved.This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2.1 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU Lesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/#define ARDUINO_MAIN
#include "Arduino.h"// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }extern USBDeviceClass USBDevice;// Initialize C library
extern "C" void __libc_init_array(void);/** \brief Main entry point of Arduino application*/
int main( void )
{init();__libc_init_array();initVariant();delay(1);
#if defined(USBCON)USBDevice.init();USBDevice.attach();
#endifsetup();for (;;){loop();if (arduino::serialEventRun) arduino::serialEventRun();}return 0;
}

可以看到arduino IDE自己实现的main(), 系统初始化init()之后, 调用用户自己的初始化函数setup(), 然后在一个循环中调用用户自己的循环处理函数loop().

arduino这么搞, 对于用户来说, 方便倒是方便, 但是不灵活. 只能处理一些实时性不强, 没有并行处理, 只有顺序处理的任务.
对于产品来说, 还是不能用arduino IDE的这种编程方式, 还是要用没有封装的, 传统的MCU编程流程.

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux并发服务器 —— 多线程并发(六)

线程概述 同一个程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域; 进程是CPU分配资源的最小单位,线程是操作系统调度执行的最小单位; Linux环境下,线程的本质就是进程; ps -Lf pid&…

简单了解ARP协议

目录 一、什么是ARP协议? 二、为什么需要ARP协议? 三、ARP报文格式 四、广播域是什么? 五、ARP缓存表是什么? 六、ARP的类型 6.1 ARP代理 6.2 免费ARP 七、不同网络设备收到ARP广播报文的处理规则 八、ARP工作机制原理 …

好玩的js特效

记录一些好玩的js特效 1、鱼跳跃特效 引入jquery:https://code.jquery.com/jquery-3.7.1.min.js 源码如下&#xff1a; <!--引入jquery--> <script src"https://code.jquery.com/jquery-3.7.1.min.js"></script> <!--引入跳跃源码--> <s…

【JavaEE】_HTML

目录 1.HTML结构 2. HTML常用标签 2.1 注释标签 2.2 标题标签&#xff1a;h1~h6 2.3 段落标签&#xff1a;p 2.4 换行标签&#xff1a;br 2.5 格式化标签 2.6 图片标签&#xff1a;img 2.7 超链接标签&#xff1a;a 2.8 表格标签 2.9 列表标签 2.10 表单标签 2.10…

Java学习笔记——35多线程02

线程同步 线程同步卖票案例同步代码块同步方法块 线程安全的类StringBufferVectorHashtable Lock锁 线程同步 卖票案例 public class SellTicket implements Runnable{private int tickets10;Overridepublic void run(){while (true){if(tickets>0){System.out.println(Th…

【网络编程】IO多路复用

IO多路复用是一种高效的I/O处理方式&#xff0c;它允许单个进程能够同时监视多个文件描述符&#xff08;sockets、文件等&#xff09;&#xff0c;并在其中任何一个文件描述符准备好进行I/O操作时进行处理。它的核心在于使用少量的线程或进程来管理多个I/O操作&#xff0c;以提…

RK3568平台开发系列讲解(音视频篇)H264 的编码结构

🚀返回专栏总目录 文章目录 一、H264 的编码结构1.1、帧类型1.2、GOP1.3、Slice沉淀、分享、成长,让自己和他人都能有所收获!😄 📢视频编码的码流结构其实就是指视频经过编码之后得到的二进制数据是怎么组织的,换句话说,就是编码后的码流我们怎么将一帧帧编码后的图像…

数据结构学习系列之顺序表的两种删除方式

方式1&#xff1a;在顺序表的末端删除所存储的数据元素&#xff0c;代码如下&#xff1a;示例代码&#xff1a; int delete_seq_list_1(list_t *seq_list){if(NULL seq_list){printf("入参为NULL\n");return -1;}if(0 seq_list->count){printf("顺序表为空…

数据结构学习系列之顺序表的两种插入方式

方式1&#xff1a;在顺序表末端插入数据元素&#xff0c;代码如下&#xff1a;示例代码&#xff1a; int insert_seq_list_1(list_t *seq_list,int data){if(NULL seq_list){printf("入参为NULL\n");return -1;}if(N seq_list->count){printf("顺序表已满…

通过rabbitmq生成延时消息,并生成rabbitmq镜像

通过rabbitmq生成延时消息队列&#xff0c;并生成rabbitmq镜像 整体描述1. 使用场景2. 目前问题3. 前期准备 具体步骤1. 拉取镜像2. 运行镜像3. 安装插件4. 代码支持4.1 config文件4.2 消费监听4.2 消息生产 5. 功能测试 镜像操作1. 镜像制作2. 镜像导入 总结 整体描述 1. 使用…

Stable Diffusion WebUI中COMMANDLINE_ARGS参数配置说明

Windows用户: 在webui-user.bat文件的set COMMANDLINE_ARGS=后面配置 Linux用户: 在webui-user.sh文件的export COMMANDLINE_ARGS=""引号中配置 COMMANDLINE_ARGS详细参数配置说明 配置(Configuration)-h, –help无错误显示此帮助消息并退出–config配置配置/稳…

蠕虫病毒流量分析案例

背景 某供排水集团的网络管理员对其网络的健康状况持认可态度&#xff0c;表示网络运行正常&#xff0c;没有发现异常行为。然而&#xff0c;由于网络环境变得越来越复杂&#xff0c;仅凭借传统的网络经验已经不能全面了解网络情况。因此&#xff0c;我们为供排水集团安装了Ne…

Codeforces Round 895 (Div. 3)

A. Two Vessels 求出目标水位&#xff0c;然后计算倒水的次数向上取整即可 void solve(){db a, b, c; cin >> a >> b >> c;print(int(ceil((max(a, b) - (abs(b a) / 2)) / c))); } B. The Corridor or There and Back Again 对于每个可能被激活的陷阱&…

使用Docker部署Gitlab的记录

docker版本 使用docker -v查看 Docker version 1.13.1, build 7d71120/1.13.1运行容器镜像 映射本机的9980端口为Docker内部的80端口 映射本机的9922端口为Docker内部的22端口 使用root用户启动 映射本机目录/mnt/sda/gitlab/log为Docker内部的/var/log/gitlab 映射本机目录…

4 | Java Spark实现 WordCount

简单的 Java Spark 实现 WordCount 的教程,它将教您如何使用 Apache Spark 来统计文本文件中每个单词的出现次数。 首先,确保您已经安装了 Apache Spark 并设置了运行环境。您需要准备一个包含文本内容的文本文件,以便对其进行 WordCount 分析。 代码 package com.bigdat…

我的创作纪念日-2023

突然看到CSDN有这么一个发文模版&#xff08;后文都是按照模版填空了&#xff09;&#xff0c;那就写一些吧。 机缘 具体有什么机缘呢&#xff1f;简单就是说&#xff0c;在CSDN上得到了一些帮助&#xff0c;因此也想写一些文章以期帮助别人。为什么不在自己的网站写呢&#…

Golang复习

golang的特点 Golang 针对并发进行了优化&#xff0c;并且在规模上运行良好 自动垃圾收集明显比 Java 或 Python 更有效&#xff0c;因为它与程序同时执行 golang数据类型 基本数据类型&#xff08;值类型&#xff09; 布尔类型 数字类型 整型 根据有符号分为&#xff1a;…

[NLP]LLM---FineTune自己的Llama2模型

一 数据集准备 Let’s talk a bit about the parameters we can tune here. First, we want to load a llama-2-7b-hf model and train it on the mlabonne/guanaco-llama2-1k (1,000 samples), which will produce our fine-tuned model llama-2-7b-miniguanaco. If you’re …

axios 请求和响应拦截器

1. 创建实例 使用 axios.create() 使用自定义配置创建一个 axios 实例。 const $http axios.create({timeout: 1000,headers: {Content-Type: application/json,} })2. 拦截器 在请求或响应被 then 或者 catch 处理前拦截他们&#xff0c;拦截分为请求拦截和响应拦截。 //…

微信小程序电影票订票小程序软件设计与实现

摘 要 我们的生活水平正在不断的提高&#xff0c;然而提高的一个重要的侧面表现就是更加注重我们的娱乐生活。电影是我们都喜欢的一种娱乐方式&#xff0c;各式各样的电影给我们带来的喜悦也是大不相同的。带来快乐的同时也因为其复杂、繁琐的流程让电影爱好者们变得烦躁起来。…