我在嵌入式系统域工作.我想知道从C文件开始如何从微控制器执行代码(uC通常不需要是主观的).此外,我想知道像启动代码,目标文件等的东西.我找不到有关上述内容的任何在线文档.如果可能,请提供从头开始解释这些事情的链接.在此先感谢您的帮助
我想知道嵌入式领域的开发人员是否知道任何有趣的技巧来帮助减轻堆栈空间非常有限的微控制器开发的痛苦.我最近为8位UC(Microchip PIC18F系列,31字节堆栈)编写了一些固件,因此我不得不压缩程序并减少传递给函数的参数数量.我也试图最小化我对较大局部变量的依赖.扁平化旨在将更少的东西放在堆栈上,减少局部变量有助于节省RAM中"自动变量"程序部分(psect)中的空间.我知道,哈佛建筑并不好玩,但这正是我正在处理的问题.我注意到从ISR深入调用多个函数的问题,这可能是我的堆栈窗口受IRQ上下文保存影响的结果.我知道我正在使用限制性架构,但我想知道是否有人有任何减少头痛的技巧.我尽可能使用指针和边界检查,但我确信有一些我没有发现自己的智慧.作为免责声明,我目前正在使用函数指针来促进状态机.我觉得我正在走90线虚空函数和实际使用函数的代码之间走钢丝.m目前正在使用函数指针来方便状态机.我觉得我正在走90线虚空函数和实际使用函数的代码之间走钢丝.m目前正在使用函数指针来方便状态机.我觉得我正在走90线虚空函数和实际使用函数的代码之间走钢丝.
我已经使用过Atmel ATMEGA和ATTINY系列微控制器,并且认为它们相当不错.但我不太喜欢的一件事是它们(以及Microchip PIC uC系列)都是哈佛机器,这意味着我无法真正将外部存储器用于RAM或仅执行闪存.
虽然这种设计有明显的优势,但从技术上讲,使用AVR或PIC进行FORTH这样的操作非常困难.(我知道至少有一个实现,但它不像普通的FORTH那样工作,而且会很快耗尽闪存)
FORTH最初是为交互式机器控制类型系统创建的,需要很大的灵活性,因此Z80或6809之类的东西被用作控制程序执行的微控制器或RAM或其他存储设备.
有没有人知道von Neumman机器的AVR/PIC具有类似复杂性的当前设备(最好是在DIP封装中可用)?
我在微控制器的c语言示例代码中看到了"printf"指令,特别是在8051中.由于微控制器没有固定的输出显示,"printf"指令的用途是什么?
在构建基于gcc的裸机mcu项目时,您需要在启动期间处理.data和.bss部分的初始化.
.bss部分非常简单,因为我只是将整个部分填充为0.但是.data部分中的变量需要将它们的初始化数据放在rom/flash中并在启动时复制.
如何知道可以在哪里找到具有初始化值的数据?
我们来举个例子吧.
假设我在main.c中创建了两个全局变量
unsigned int my_global_variable_one = 1;
unsigned int my_global_variable_two = 2;
Run Code Online (Sandbox Code Playgroud)
然后我可以在目标文件上使用objdump来查看它们将在哪个部分,但是我在objdump out中找不到任何应该放置init数据的内容.
$ arm-none-eabi-objdump --syms main.o | grep my_global_variable
00000000 g O .data 00000004 my_global_variable_one
00000004 g O .data 00000004 my_global_variable_two
Run Code Online (Sandbox Code Playgroud)
然后我可以看看整个系统产生的精灵,在本例中是main.elf.
$ arm-none-eabi-nm -n main.elf | grep my_global_variable
20000000 D my_global_variable_one
20000004 D my_global_variable_two
Run Code Online (Sandbox Code Playgroud)
我在哪里可以找到它们的位置,以便我可以复制数据?我需要在链接器脚本中添加什么内容?
它应该像.text或.rodata,但我怎么知道?
如何检查my_global_variable_one的init数据的位置?
我可以使用readelf或objdump等任何binutils命令找到此数据的位置吗?
/谢谢
这是在stm32(Cortex M3)mcu上,使用了CodeBench版本的gcc.
嗯..我一直在网上搜索很多角落..但我找不到解决问题的办法.上次我使用AVRISP2时效果很好.现在,当我尝试在uC上编写程序时,我收到以下消息:
avrdude: stk500v2_command(): command failed
avrdude: stk500v2_program_enable(): bad AVRISPmkII connection status: Unknown status 0x00
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
Run Code Online (Sandbox Code Playgroud)
我在互联网上发现了很多帖子,但没有任何解决方案.有谁知道问题可能是什么?
我已经检查了引脚,我更新了ISP的固件(blinkdemo工作).
谢谢你的任何提示..
我正在使用ST微控制器开发一个ttyACM设备,并且使用相同的代码,我的主机有时可以成功地枚举它(下面),但有时它只是转储下面的消息.错误-32是什么意思?
[未能注册]
usb 1-2.1: new full speed USB device number 62 using ehci_hcd
usb 1-2.1: device descriptor read/64, error -32
usb 1-2.1: device descriptor read/64, error -32
usb 1-2.1: new full speed USB device number 63 using ehci_hcd
usb 1-2.1: device descriptor read/64, error -32
usb 1-2.1: device descriptor read/64, error -32
usb 1-2.1: new full speed USB device number 64 using ehci_hcd
usb 1-2.1: device not accepting address 64, error -32
usb 1-2.1: new full speed USB device number …Run Code Online (Sandbox Code Playgroud) 这个问题与绘制软件过程有关.作为一名电气工程师,我所做的大部分软件都是用于嵌入式微控制器.在学校,我们学会了使用流程图来说明我们的算法.然而,如今,我的许多嵌入式项目都是严重中断驱动的,其中主进程运行一些基本算法,各种中断源提供其刺激.所以,我的问题是,我可以使用哪些图表技术来说明我的流程,以便未来的开发人员能够轻松理解我在做什么并参与开发?
以下是我要寻找的一些关键功能:
所以我尝试将硬件NSS信号与HAL库一起使用,但我找不到任何使NSS引脚具有低电平或高电平的功能.我也试图在HAL文档中找到答案,但也没有任何信息.Internet中的所有示例仅包含NSS软件.如何使用硬件NSS?
我想尝试将一些Arduino库移植到stm32.在Arduino中,millis()返回自引导以来的毫秒数.在stm32中是否有等效的功能?我正在使用stm32f0 MCU.
microcontroller ×10
embedded ×4
c ×3
stm32 ×2
8-bit ×1
8051 ×1
arduino ×1
arm ×1
avr ×1
avrdude ×1
bare-metal ×1
diagram ×1
firmware ×1
gcc ×1
linker ×1
linux ×1
linux-kernel ×1
milliseconds ×1
pointers ×1
spi ×1
stm32f0 ×1
uml ×1
usb ×1
von-neumann ×1