问题标签 [8051]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
optimization - 8051 汇编语言中内存优化的技术有哪些?
我需要优化代码为一些新代码腾出空间。我没有空间进行所有更改。我不能使用代码库切换(80c31 和 64k)。
c - 如何标记带有副作用的代码?
我正在开发一个 8051 上的项目,其中每个字节都很重要。因此,我使用了一些我通常不会使用的全局变量。将指针传递给函数的常规方法在这里增加了太多开销。
除了正常的返回值之外,我有许多函数使用单比特变量(编译器特定的C扩展)来表示函数的结果。
鉴于该技术是邪恶的,有什么方法可以使代码更清晰吗?
我应该如何最好地指示哪些函数调用会产生设置这些标志的副作用?评论够吗?我应该命名函数以指示它们的 API(准匈牙利风格)吗?我是否应该使用宏来标记此类调用:
还有其他想法吗?
c++ - 8051微控制器的C++?
有人可以告诉我是否可以用 C++ 程序烧录 8051 微控制器?我试过在网上搜索它,但似乎无法确定它是否可能。Keil 使用 C,但我需要编写的程序是字符串密集型的,与我习惯使用的 C# 相比,C 对字符串非常不友好。目前,我正在尝试用 C 编写代码,但它变得非常混乱,所以如果我可以用 C++ 编写它,我会非常放心。
我需要一个 C++ 编译器来创建一个十六进制输出文件,然后可以将其刻录到微控制器上。有人听说过我可以使用的东西吗?而且,C 使用了一个头文件,可以让你引用端口,但是当我试图找出这个头文件是否也在 C++ 中使用时,我找不到任何关于它的信息。
另外:我使用的微控制器是带有 4K 字节可重编程闪存和 128 x 8 位内部 RAM 的 Atmel AT89C51。这实际上是针对大学项目的机器人,编码实际上不需要 OOP。它只是有很多二维字符串数组格式的查找表。我想考虑 C++ 的唯一原因是因为操作字符串似乎变得非常混乱(由于我缺乏 C 专业知识)。
有人知道头文件吗?C 使用 #include reg51.h 但我试图找出这是否适用于 C++ 并且找不到任何内容。
assembly - 解开汇编语言意大利面条代码
我继承了一个用 8051 汇编语言编写的 10K 行程序,需要进行一些更改。不幸的是,它是按照意大利面条代码的最佳传统编写的。该程序——作为单个文件编写——是一个由 CALL 和 LJMP 语句组成的迷宫(总共大约 1200 条),如果子程序可以被识别为子程序,则它们具有多个入口和/或出口点。所有变量都是全局的。有评论;有些是正确的。没有现有的测试,也没有重构预算。
应用程序的一些背景知识:代码控制当前在国际上部署的自动售货应用程序中的通信中心。它同时处理两个串行流(在单独的通信处理器的帮助下),并且可以与多达四个不同的物理设备进行通信,每个设备来自不同的供应商。其中一个设备的制造商最近进行了更改(“是的,我们进行了更改,但软件完全一样!”)导致某些系统配置不再工作,并且对不更改它不感兴趣(无论它是什么他们没有改变)。
该程序最初是由另一家公司编写的,然后转让给我的客户,然后在九年前由另一位顾问进行了修改。原始公司和顾问都不能作为资源使用。
根据对其中一条串行总线上的流量的分析,我想出了一个 hack,它似乎有效,但它很丑陋,并且没有解决根本原因。如果我对该程序有更好的了解,我相信我可以解决实际问题。我还有大约一周的时间冻结代码以支持月底发货日期。
原始问题:我需要对程序有足够的了解才能在不损坏的情况下进行更改。有没有人开发出处理这种混乱的技术?
我在这里看到了一些很棒的建议,但时间有限。然而,我将来可能有另一个机会去追求一些更复杂的行动方案。
c - 如何仅从 8051 串行发送字符串一次?
我正在制作一个 8051 微控制器与计算机进行无线通信。微控制器将向其串行端口 (DB9) 发送一个字符串,计算机将接收该字符串并对其进行操作。
我的问题是我不知道如何让 8051 只传输一次字符串。由于我需要在 PC 端操作字符串,因此只能接收一次。目前,即使在 C 代码中我发送了一次字符串,但在我的计算机上我连续接收到相同的字符串。我认为这是因为 SBUF 中的任何内容都是连续传输的。有什么方法可以让我的字符串只发送一次吗?有没有办法清空 SBUF?
我尝试使用 DB9 上的 RTS(请求发送)引脚(第 7 个引脚),因为我在某处读到,如果我否定该引脚上的电压,它将停止数据流向串行端口。所以我所做的是对我的微控制器进行编程以发送字符串,然后将逻辑电平 0 发送到连接到我的 DB9 RTS 引脚的输出引脚。然而,这并没有奏效。
有没有人有什么建议?我真的很感激他们。
编辑
我在 PC 上使用的软件是用于 Xbee 模块的 X-CTU。这是我的微控制器上的代码:
有人可以验证它实际上只发送一次字符串吗?
编辑
看起来史蒂夫、布鲁克斯莫斯和尼尔一针见血,他们说这是在我的主要功能之后发生的事情导致了问题。我刚刚尝试了史蒂夫提出的建议代码(更具体地说是 for(;;); 并在 main 之外定义 serTX),它运行良好。控制器可能已重新启动,因此相同的代码不断重复。
非常感谢你的帮忙!:)
embedded - 如何在 8051 中使用无线串口连续发送和接收?
我正在尝试使微控制器与我桌面上的程序进行通信。我在两端都使用带有 Xbee 无线电的串行端口连接。
当我从微控制器向桌面发送一些东西并且桌面上的程序然后将一些东西发送回微控制器时,通信工作正常。
但是,当我要求将信息从控制器连续发送到桌面程序时,直到桌面程序发送特定的答案,它就不起作用了。
这是我正在谈论的代码:
BuildString() 函数只是根据一些传感器输入构造一个字符串。发送和接收函数通常工作正常,但是当我需要它们连续发送和接收时,就像上面的 Configure() 函数一样,它不起作用。
有什么建议么?我真的很感激他们。
assembly - 微控制器 8051:如何获取 JB 和 CJNE 指令的输入地址?
我正在从头开始用 VHDL 实现整套 8051 指令。大多数事情进展顺利,但偶然发现了这两条指令:
非常感谢任何帮助或提示。先感谢您!
emulation - 8051模拟器的制作方法
出于学习目的,我打算开始构建一个 8051 微控制器仿真器。我很擅长用 C/C++/C# 编程。这不是课堂项目等,而是我这边的学习计划。
我确实发现了很多讨论这个问题的问题。但是,我想更细化地打破它,以便在我真正开始编写代码之前知道我需要关注哪些领域。
我最初的要求是:
文本编辑器(可以使用编辑框控件),用户可以在其中编写汇编代码
验证语法是否正确
有一个小窗口,在运行时显示寄存器值。
当用户启动程序时,说明应逐步更新注册窗口。
除了 GUI 元素,我更想知道如何模拟微控制器。
我理解的方式可以进一步分解:
我需要查找表以获取指令或其他方式来存储可用指令并验证语法。任何指示如何实现这一点,请告诉我。
如何模拟 8051 的每条指令?
对于寄存器,我可以根据类型使用无符号整数并更新表。
由于微控制器的 RAM 内存有限,我如何检查代码长度或更确切地说是在内存中执行的代码,以避免和缓冲区溢出或其他问题。
如果有一些开源项目详细说明了如何构建模拟器,将不胜感激。
c - 我什么时候使用 xdata?
我是嵌入式系统编程的新手。我正在开发使用 8051 芯片组的设备。我在示例程序中注意到,在定义变量时,有时它们使用关键字 xdata。像这样...
静态无符号字符 xdata PatternSize;
而其他时候 xdata 关键字被省略。
我的理解是 xdata 关键字指示编译器将该变量存储在外部、闪存、内存中。
在什么情况下我应该使用 xdata 在外部存储变量?访问这些变量需要更长的时间,对吧?使用 xdata 存储的值在设备硬重置后不会保留,是吗?
另外,我知道 static 关键字意味着该变量将在每次调用它定义的函数时保持不变。 static 和 xdata 必须一起使用吗?
embedded - 将编译后的程序上传到 C51 微控制器
我正在尝试将已编译的程序上传到微控制器..我的问题不在于编程或上传东西..我的问题是上传什么
该程序是 C 语言并使用 SDCC 编译的。单片机是 ATMEL 的 AT89S8252。
我按照数据表中所述的用于串行编程的 MCU 协议构建了一个简单的并行端口编程器。
到目前为止一切顺利.. 但是.. 我应该将什么上传到 mcu?
编译时,SDCC 会生成很多文本报告.. 然后是 .ihx.. 我怀疑我不应该直接上传这个文件,而是以某种方式对其进行后期处理以获取要上传的实际原始字节?
任何帮助将不胜感激 =)