是否有大会的代码约定(主要是PIC)?
我遇到了PIC Micro控制器的问题.
我很久以前就有一个由我编程的微控制器,我丢失了相关的源代码和原理图.现在我需要反转端口的值.我可以使用一些NOT门来做到这一点,但这样做很麻烦.或者我需要写回整个程序.
我不希望在PIC C或MikroC中看到代码.拥有可理解的汇编代码就足够了.
那么有没有人对我可以用于此目的的好的HEX反编译器有任何经验?根据您的经验发表任何评论?:)
编辑:器件PIC 16F84A
我正在考虑编写一个自动更换自行车装备的程序.它可能需要一个微处理器,所以我想到的问题是:编程微处理器有什么不同的语言,还是可以用c和c ++来完成?
另一件事是,关于程序,一个switch声明可以做我的工作,还是我需要指针或链表,因为齿轮可以上下两种方式工作?我对switch陈述事情有点困惑!
目前我们正在学习如何编程AVR微控制器(仅限Ansi C89标准).部分包含的驱动程序是一个标题,用于处理调度,即以不同的速率运行任务.我的问题是与文档中的引用有关:
"每个任务必须通过使用静态局部 变量来维护自己的状态."
那是什么意思呢?他们似乎传递void*给维持状态的功能但是不使用它?
看一下我收集的文件中的代码,这就是他们的意思:
{.func = led_flash_task, .period = TASK_RATE / LED_TASK_RATE, .data = 0}
/* Last term the pointer term */
Run Code Online (Sandbox Code Playgroud)
有一个函数在数组中使用上述参数运行,但它只作为调度程序.然后功能led_flash_task是
static void led_flash_task (__unused__ void *data)
{
static uint8_t state = 0;
led_set (LED1, state); /*Not reall important what this task is */
state = !state; /*Turn the LED on or off */
}
Run Code Online (Sandbox Code Playgroud)
并从标题
#define __unused__ __attribute__ ((unused))
Run Code Online (Sandbox Code Playgroud)
而传递void *data是为了维持任务的状态?这是什么意思?
谢谢您的帮助
当我正在研究TMS320F2806x(Piccolo)MCU的架构时,我发现其中的一个功能是6通道DMA.你能否详细说明DMA 的渠道是什么意思?
我正在尝试为PIC18制作一个引导程序,所以我需要了解如何正确处理hex文件.例如,我理解如何处理以下十六行.
:040C0000E2EFFFF030
Run Code Online (Sandbox Code Playgroud)
04:字节数
0C00 :十六进制数字的地址
00:数据记录
E2EFFFF0:数据序列
30:校验和
所以我会知道如何处理上面的行,但是下面的十六行怎么样.
:020000040001F9
Run Code Online (Sandbox Code Playgroud)
02 :字节数
0000: 地址
04:扩展线性地址记录
0001:数据
F9:校验和
但究竟我该怎么做呢?我是否将这些数据写入该地址?你能把它翻译成机器语言吗?
顺便说一下,我的应用程序从地址开始,0c00bootloader从地址开始,在0020它上面是中断向量.谢谢!
更新
如果hex文件的第三行是以下,地址会FFC0改变吗?
:10FFC000FF00FF00FF00FF00FF00FF000001E9EF5E
Run Code Online (Sandbox Code Playgroud)
我在想,因为hex文件的第二行有04(扩展线性地址记录),那么我应该添加0001到第三行的地址FFC0,所以新地址就是这样的.
$0001 + $FFC0将等于1FFC0,所以第3行的下一组数据字节应写入此地址1FFC0,这是正确的吗?
我想在JAVA中编写一个程序,它可以控制LED灯连接到连接到计算机的"东西".
JAVA程序将包含JFrame中的8个切换按钮.按钮编号从1到8,当按下编号为X的按钮时,编号为X的LED将打开; 再次单击(切换)该按钮时,该LED将关闭.
与我们必须在其中加载代码的微控制器不同,我提到的"某些东西"只是接收来自JAVA的信号(可能通过USB/SerialPort/...)来控制灯光.例如,JAVA通过SerialPort将0000_0101(打开LED 1号和3号灯)发送到"某物",然后"东西"将"保留"该值,直到发送新信号.该值的每个数字代表"某物"上引脚的高/低,我将引脚连接到LED.
"Something"可能类似于可以将"串行端口信号"转换为"二进制"并将"二进制"保存在具有输出引脚的寄存器中的设备,我可以将它们连接到LED.
那可能吗?有没有像"东西"这样的设备?它是什么?有没有人有任何建议?还是一些更好的方法来控制PC的灯光?
我有一些使用GCC构建的固件,它运行在基于ARM Cortex M0的微控制器上.构建当前生成单个二进制映像,可以将其写入微控制器的程序存储器中.
由于与字段更新有关的原因,我需要将此图像分成两个部分,可以单独更新.我将这些称为Core和App.
核心:包含中断向量表,main()例程以及各种驱动程序和库例程.它将位于程序存储器的前半部分.
应用:包含特定于应用程序的代码.它将位于程序存储器的后半部分.它将在一个已知地址处有一个入口点,由核心调用以启动应用程序.它将通过已知地址访问核心中的功能和数据.
这里有一些明显的限制,我很清楚:
构建应用程序时,需要知道核心中符号的地址.因此必须首先构建核心,并且在链接应用程序时必须可用.
应用程序映像仅与其构建的特定核心映像兼容.
可以在不更新核心的情况下更新应用程序,但反之亦然.
所有这一切都没问题.
我的问题很简单,我如何使用GCC和GNU binutils构建这些图像?
基本上我想像正常的固件映像一样构建核心,然后构建应用程序映像,应用程序将核心视为库.但是,共享链接(这将需要动态链接机制)或静态链接(将复制用于应用程序二进制文件的核心功能)都不适用于此处.我正在尝试做的事情实际上要简单得多:使用已知的固定地址链接现有的二进制文件.我不清楚如何用这些工具做到这一点.
我知道最新的 STM32 微控制器中的 RAM 存储器包含几个具有显着速度差异的部分。这就是为什么我试图围绕这些设备的链接描述文件(注意:arm-none-eabi-gcc工具链)。不幸的是,CubeMX 为 STM32F767ZI 生成的链接描述文件只是忽略了 RAM 中的不同部分:
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 512K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K
}
Run Code Online (Sandbox Code Playgroud)
STMicroelectronics 似乎已经做了一些努力,使其最新的STM32H743ZI的链接描述文件更加复杂:
/* Specify the memory areas */
MEMORY
{
DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K …Run Code Online (Sandbox Code Playgroud) 我开始在Arduino上使用端口,而不是手动将每个引脚设置为低电平或高电平.这非常有用且速度更快.我正在进行一个项目,我需要至少一个完整端口(8位)和至少一个串行端口.
我想使用Arduino UNO,但它只有一个完整的端口,端口D. PD0和PD1用于串行通信.这意味着我不能使用端口D.
我想知道是否有可能将多个端口合并为"虚拟端口".最后我想要这样的东西:
PORTX = 0b11111111; // the first 2 bits are PB0/PB1 and bit 3-8 are PD3-PD8
Run Code Online (Sandbox Code Playgroud)
这有可能吗?
microcontroller ×10
c ×3
embedded ×3
gcc ×2
arduino ×1
arduino-c++ ×1
arm ×1
assembly ×1
avr ×1
binutils ×1
bootloader ×1
comments ×1
conventions ×1
decompiling ×1
device ×1
hardware ×1
java ×1
led ×1
linker ×1
mikroc ×1
pic ×1
port ×1
stm32 ×1
void ×1