【问题标题】:Programming Arduino in C, will Interrupt Vectors work?用 C 语言编程 Arduino,中断向量可以工作吗?
【发布时间】:2014-11-23 08:41:14
【问题描述】:

我让 Arduino 可以玩……但 Arduino 语言和 IDE 对我来说就像是孩子的玩具。

所以我想用普通的 C 来编程。

据我了解,引导加载程序位于内存的某个位置,在重置向量中有一个 rjmp,完成后,将控制权返回给已安装的“草图”。

问题是:我可以在“草图”中安全地做什么?

这是我目前对带有 Arduino Bootloader 的 AVR 的看法,但它可能是错误的:

.CSEG
.ORG 0000
rjmp bootloader
; ??? Interrupt vectors here
; ??? Interrupt vectors here
; Maybe it all goes to bootloader and it then forwards
;   it to handlers in the "sketch"?

bootloader:
; ??? some magic tricks here 
rjmp sketch

sketch:
; "Sketch" code
; I want my own interrupt vectors, too!
end:
rjmp end;

我的意思是,很明显,Bootloader 使用了 AVR 的一些其他部分来实现它的功能,所以它会有自己的中断处理程序等。如果我在我的程序中使用它们,它们会按预期工作吗?

那么,使用 C(甚至是汇编程序)编程 Arduino 有什么问题?

【问题讨论】:

  • 引导加载程序位于上部闪存中,不会干扰您的代码。您可以使用所有中断向量。要使用纯 C 语言对 Arduino 进行编程,您只需查看 Arduino 环境附带的avr-libc 的文档。

标签: c assembly arduino avr


【解决方案1】:

支持引导加载程序的 AVR 设备具有 两组 组中断向量,一组用于引导加载程序(位于引导加载程序部分的开头),一组用于常规固件(位于地址 0)。 BOOTRST 熔断器确定默认使用哪个复位向量,MCUCR 中的IVSEL(或设备中的等效项)确定当前处于活动状态的集合。

请注意,锁定位可以限制可以使用的集合,并且一如既往地查看数据表以获取完整详细信息。

【讨论】:

    【解决方案2】:

    它会起作用的。 Arduino 只是一个图书馆。如果您查看源代码,setup()loop() 函数将插入到int main()setup() 就在无限 while(true) 循环之前。

    【讨论】:

    • 我不是在谈论那个,而是引导加载程序是否不会干扰我的程序。但显然它以某种方式与其他代码分开。
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2011-05-15
    • 2013-08-23
    • 2021-01-26
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多