我正在尝试调试在attiny84a上运行的程序,我无法理解如何使用它,或者解释其输出或两者。出于测试目的,我创建了一个简单的程序,即我上传到微控制器,只需设置测试变量的值unsigned char test_var = 0xaa
,并输出低于Porta6。然后,我将微控制器放入调试模式,然后使用GDB开始调试。
首先我想打印测试变量的值,所以我打字打印test_var.
,输出$ 9 = 170'\ 252'
我猜9美元
是指输出计数,我知道170 = 0xAA,但我不知道是什么'\ 252'
方法。
接下来我将变量改为achar
而不是A.无符号的字符
并跑得一样打印test_var.
,我得到了一个产出$ 10 = -86'\ 252'
这对我来说并不是很多意义。据我所知,当你有签名的char(或只是char)字节的MSB表示数字的符号,所以如果有一个1
在byte的Bit7,这意味着它是一个负数,所以当你看0xAA.
你有0B10101010
。在bit7你有一个1
这意味着数字是负面的,这是有意义的;但是,前面的7位0B0101010
,当转换为十进制等于42时,所以数字应该是-42,但根据GDB,它是-86。我对此做错了什么?
接下来我想读取方向寄存器DDRA,因为我将DDA6设置为Porta6的输出,以便设置为低电平。由此,我会知道DDRA的DDA6位应该是一个1,所以我想打印DDRA的内容来看。
首先我尝试过打印DDRA.
哪个输出= 0'\ 000'
这没有意义,因为我知道在DDA6应该有一点设置,但这就是说该寄存器中没有设置任何比特。最重要的是,有一个“\ 000”与之前的“\ 252”不同。
我认为也许它需要寄存器的物理内存地址,所以我看了寄存器摘要部分中的attiny84a数据表的结尾,并看到DDRA有内存地址0x1a(0x3a)(我不确定括号中的第二个值是什么指我尝试过两次),所以我试过打印0x1a.
哪个输出= 26.
和打印0x3a.
哪个输出= 58.
这两者都没有意义,因为我应该看到64,指示已经设置了DDRA的Bit6。在此之上,这些输出缺少之前的“\ 000”和“\ 252”。
我的理解在哪里?我和一切都得到了如此不同的价值,我绝对不知道为什么,我会喜欢一些帮助。
谢谢!
编辑:以下是根据要求的代码,以及DDRA寄存器的GDB事务。
程序代码:
#include char test_var = 0xaa;//还使用“无符号Char` void Main(void){DDRA | =(1 << DDA6)进行测试;porta&=〜(1 << porta6);虽然(1){}}
GDB输出:
(GDB)打印DDRA $ 15 = 0'\ 000'(GDB)打印0x1a $ 16 = 26(GDB)打印0x3a $ 17 = 58
来自数据表:
test_var.
设置为0xAA,因为它是通过C运行时初始化的,但是您也从未在主要的单一代码中执行。 \ $ \ end group \ $-Erikr. 6月5日3:54打印0x1a.
您正在告诉GDB打印数字0x1a,这是26.您必须取消引用指向地址0x1a的指针。就像是打印*((未签名的char *)0x1a)
\ $ \ end group \ $-Erikr. 5月5日在4:02