0.
\ $ \ begingroup \ $

我正在尝试调试在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

来自数据表:

在此输入图像描述

\ $ \ end group \ $
10.
  • \ $ \ begingroup \ $ 您应该包括您的程序以及设置断点的位置。与GDB互动的完整成绩单也会有所帮助。 \ $ \ end group \ $-Erikr. 君5:45
  • \ $ \ begingroup \ $ @erikr我添加了代码。你对与GDB互动的成绩单是什么意思?只是发送的命令列表? \ $ \ end group \ $-Kalcifer. 6月5日3:47
  • \ $ \ begingroup \ $ 这是与GDB互动的屏幕截图。它显示您输入的所有命令以及GDB打印给您的GDB。 \ $ \ end group \ $-Erikr. 6月5日3:48
  • 1
    \ $ \ begingroup \ $ 如果这些都是您输入GDB的命令,那么您从不开始执行程序。test_var.设置为0xAA,因为它是通过C运行时初始化的,但是您也从未在主要的单一代码中执行。 \ $ \ end group \ $-Erikr. 6月5日3:54
  • 1
    \ $ \ begingroup \ $ 当你说打印0x1a.您正在告诉GDB打印数字0x1a,这是26.您必须取消引用指向地址0x1a的指针。就像是打印*((未签名的char *)0x1a) \ $ \ end group \ $-Erikr. 5月5日在4:02
2
\ $ \ begingroup \ $

但我不知道'\ 252'的意思是什么。

这是八万值。它等于2 + 5 * 8 + 2 * 8 * 8 = 170。

另一个例子:'\ 123'是八进制的3 + 2 * 8 + 1 * 8 * 8 = 83。

接下来我将变量更改为char而不是无符号char并运行相同的打印test_var,我得到了$ 10 = -86'\ 252'的输出

170大于127,所以当表示为一个char(这是一个签名的值)你会看到-86。

据我所知,当您有签名的char(或只是char)时,字节的MSB表示数字的符号,因此如果字节的Bit7处有1,则表示其负数,所以,当你看起来0xAA时,你有0b10101010。在Bit7你有一个1,这意味着数字是负面的,这是有意义的;然而,在转换为十进制时,前面的7位0b0101010等于42,因此数量应该是-42,

要将0xAA的值确定为符号的8位数,请弄清楚您必须添加多少以添加到0x00,这是负值。

例如,0xAA + 0x56 = 0x00,因此0xAA为负0x56,或负86。

另一个例子:0xFF作为签名的数字与-1相同,因为0xFF + 1 = 0。

接下来我想读取方向寄存器DDRA,因为我将DDA6设置为Porta6的输出,以便设置为低电平。由此,我会知道DDRA的DDA6位应该是一个1,所以我想打印DDRA的内容来看。

基于在评论中的讨论,看起来您从未启动您的程序。

以下是要控制执行的GDB命令列表。使用的主要部分是继续

https://sourceware.org/gdb/onlinedocs/gdb/continuing-and-stepping.html.

\ $ \ end group \ $
2
  • \ $ \ begingroup \ $ OK - 请附上您的计划列表和GDB会话的成绩单。 \ $ \ end group \ $-Erikr. 君5:45
  • \ $ \ begingroup \ $ 请参阅更新的问题。 \ $ \ end group \ $-Kalcifer. 6月5日在3:52

你的答案

点击“发布答案”,您同意我们的同意服务条款隐私政策Cookie政策

不是您要找的答案?浏览其他标记的问题或者问你自己的问题