运行 Arduino 上的多个草图
Running multiple sketches on Arduino
我目前在 ATMEGA644P 上使用 运行 定制板,带有附加的 TFT 显示器。我想在上面 运行 两个单独的草图,一个草图是用 C 编写的复杂开源代码,另一个是我自己用 Arduino 编写的代码。将两者结合起来非常复杂且耗时,因为它们不 运行 在相同的核心库上。
我的意图是将两个十六进制格式的草图上传到板上,并有一个 selector 开关,它将根据开关的状态启动到正确的草图。我研究了一些解决方案,但 none 似乎完全符合我的需要,以下是我研究过的解决方案:
解决方案 1
使用 Jon Mackey 的 AVRmultisketch。
这使用编译多个 ino 文件的自定义应用程序和一个 selector sketch,其中 selector sketch 将设置内存中 sketch 的起始地址。主要问题是我的草图之一没有 ino 格式。
解决方案 2
正在从 SD 卡启动。
因为我有一张 SD 卡连接到板上,我想知道我是否可以将两个 hex 文件存储在 SD 卡中,并使用自定义草图或引导加载程序来 select 使用哪个草图。不幸的是,我找不到很多关于此的文档。大多数方法展示了如何直接从 SD 卡上传草图,而无需任何 selection 过程。
有什么指南或方法可以用来实现我的目标吗?
所以我不确定这是唯一的方法还是最好的方法,但我设法通过使用 avr_boot 引导加载程序来做到这一点,该引导加载程序将在引导时从 SD 卡上传草图。我已经成功地用 arduino nano (ATMEGA328P) 测试了它。
首先确保默认文件可以编译。然后根据指南修改Makefile。引导地址可以通过将引导地址乘以 2.For 来计算 ATMEGA328P 的示例引导地址,其中高熔丝位设置为 0xD8 是 0x7000 。还要注意SD卡的CS引脚。
然后修改main.c文件第39行
const char filename[13] ="FIRMWARE.BIN[=10=]";
有了这个
const char filename1[14] ="FIRMWARE1.BIN[=11=]"; // EDIT FILENAME HERE
const char filename2[14] ="FIRMWARE2.BIN[=11=]";
你可以使用任何你想要的文件名,只要确保它们都是大写的并且不占用数组大小即可。
然后替换这一行 194
fresult = pf_open(filename);
有了这个
DDRB &= ~(1 << PB1);
if ((PINB & (1 << PB1))) /* test button pressed */
{
fresult = pf_open(filename1);
}else{
fresult = pf_open(filename2);
}
我将 PB1 用作选择器引脚。因此,它将在其高时打开 filename1,在其低时打开 filename2。现在,每次芯片启动时,它都会检查 PB1 的状态并从 SD 卡上传正确的草图。这可能需要一些时间,具体取决于草图的大小。它还会耗尽 PROGRAM MEMORY 10000 次写入周期,这已经很多了。一种可能的解决方法是通过将高熔丝位设置为 0xD9 来禁用引导复位向量。这将使它只在按下复位按钮时而不是在开机时进入引导加载程序。
通过正确的配置,我也设法在 ATMEGA644PA 上运行。但是,它仅适用于启用的引导复位向量。我不确定这个问题的原因,但现在可以了。
我目前在 ATMEGA644P 上使用 运行 定制板,带有附加的 TFT 显示器。我想在上面 运行 两个单独的草图,一个草图是用 C 编写的复杂开源代码,另一个是我自己用 Arduino 编写的代码。将两者结合起来非常复杂且耗时,因为它们不 运行 在相同的核心库上。
我的意图是将两个十六进制格式的草图上传到板上,并有一个 selector 开关,它将根据开关的状态启动到正确的草图。我研究了一些解决方案,但 none 似乎完全符合我的需要,以下是我研究过的解决方案:
解决方案 1
使用 Jon Mackey 的 AVRmultisketch。
这使用编译多个 ino 文件的自定义应用程序和一个 selector sketch,其中 selector sketch 将设置内存中 sketch 的起始地址。主要问题是我的草图之一没有 ino 格式。
解决方案 2
正在从 SD 卡启动。
因为我有一张 SD 卡连接到板上,我想知道我是否可以将两个 hex 文件存储在 SD 卡中,并使用自定义草图或引导加载程序来 select 使用哪个草图。不幸的是,我找不到很多关于此的文档。大多数方法展示了如何直接从 SD 卡上传草图,而无需任何 selection 过程。
有什么指南或方法可以用来实现我的目标吗?
所以我不确定这是唯一的方法还是最好的方法,但我设法通过使用 avr_boot 引导加载程序来做到这一点,该引导加载程序将在引导时从 SD 卡上传草图。我已经成功地用 arduino nano (ATMEGA328P) 测试了它。
首先确保默认文件可以编译。然后根据指南修改Makefile。引导地址可以通过将引导地址乘以 2.For 来计算 ATMEGA328P 的示例引导地址,其中高熔丝位设置为 0xD8 是 0x7000 。还要注意SD卡的CS引脚。
然后修改main.c文件第39行
const char filename[13] ="FIRMWARE.BIN[=10=]";
有了这个
const char filename1[14] ="FIRMWARE1.BIN[=11=]"; // EDIT FILENAME HERE
const char filename2[14] ="FIRMWARE2.BIN[=11=]";
你可以使用任何你想要的文件名,只要确保它们都是大写的并且不占用数组大小即可。 然后替换这一行 194
fresult = pf_open(filename);
有了这个
DDRB &= ~(1 << PB1);
if ((PINB & (1 << PB1))) /* test button pressed */
{
fresult = pf_open(filename1);
}else{
fresult = pf_open(filename2);
}
我将 PB1 用作选择器引脚。因此,它将在其高时打开 filename1,在其低时打开 filename2。现在,每次芯片启动时,它都会检查 PB1 的状态并从 SD 卡上传正确的草图。这可能需要一些时间,具体取决于草图的大小。它还会耗尽 PROGRAM MEMORY 10000 次写入周期,这已经很多了。一种可能的解决方法是通过将高熔丝位设置为 0xD9 来禁用引导复位向量。这将使它只在按下复位按钮时而不是在开机时进入引导加载程序。
通过正确的配置,我也设法在 ATMEGA644PA 上运行。但是,它仅适用于启用的引导复位向量。我不确定这个问题的原因,但现在可以了。