有人可以告诉我是否可以使用C++程序刻录8051微控制器?我试过在线搜索它,但似乎无法确定是否可能.Keil使用C,但是我需要编写的程序是字符串密集型的,与C#相比,C是非常不符合字符串的,这是我以前习惯使用的.目前,我正在尝试用C语言编写代码,但它变得非常混乱,所以如果我能用C++编写它,我会非常放心.
我需要一个C++编译器来创建一个Hex输出文件,然后可以将其烧录到微控制器上.有人听说过我可以使用的东西吗?而且,C使用一个头文件,让你引用端口,但当我试图找出这个头文件是否在C++中使用时,我找不到任何关于它的信息.
另外:我使用的微控制器是Atmel AT89C51,具有4K字节的可重编程闪存和128 x 8位内部RAM.这实际上是用于大学项目的机器人,编码实际上并不需要OOP.它只有很多以2D字符串数组格式查找的表.我想考虑C++的唯一原因是因为操作字符串似乎有些混乱(由于我缺乏C语言专业知识).
有没有人知道头文件?C使用#include reg51.h但我试图找出它是否适用于C++并且无法在其上找到任何内容.
我想知道是否有一种使用8位数据类型从0到255计数的简洁方法,如:
for(uint8_t i(0);i<=255;++i)
{
....
}
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,但它清楚地表明你想从0到255计数.
一个有效的解决方案是:
uint8_t i(0);
do
{
...
++i;
}
while(i > 0);
Run Code Online (Sandbox Code Playgroud)
但是在这里它根本不清楚从0到255的数量.
这也可以,但它只是丑陋恕我直言:
uint8_t i(0);
while(true)
{
...
if (i == 255)
{
break;
}
++i;
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道,有没有一种干净的方法来做到这一点,而不使用更大的数据类型?
编辑:
我已经使用过Atmel ATMEGA和ATTINY系列微控制器,并且认为它们相当不错.但我不太喜欢的一件事是它们(以及Microchip PIC uC系列)都是哈佛机器,这意味着我无法真正将外部存储器用于RAM或仅执行闪存.
虽然这种设计有明显的优势,但从技术上讲,使用AVR或PIC进行FORTH这样的操作非常困难.(我知道至少有一个实现,但它不像普通的FORTH那样工作,而且会很快耗尽闪存)
FORTH最初是为交互式机器控制类型系统创建的,需要很大的灵活性,因此Z80或6809之类的东西被用作控制程序执行的微控制器或RAM或其他存储设备.
有没有人知道von Neumman机器的AVR/PIC具有类似复杂性的当前设备(最好是在DIP封装中可用)?
我通过460Kbaud UART将PIC24H单片机的数据传输到蓝牙无线电模块.在大多数情况下,此流程工作正常,蓝牙模块使用CTS和RTS线路来管理其内部数据缓冲区已满时的流量控制.但是,蓝牙模块中存在某种类型的错误,当数据连续发送到它而没有任何中断时会重置它,如果我的数据在另一个瓶颈中备份,就会发生这种情况.
如果模块正常工作会很好,但这是我无法控制的.因此,似乎我唯一的选择是在我的端部进行一些数据限制,以确保我不超过数据吞吐量限制(我通过实验大致知道).
我的问题是如何实现数据速率限制?
我当前的UART实现是一个RAM循环FIFO缓冲区,其长度为1024字节,主循环将数据写入.当最后一个字节由UART硬件发出并且我的ISR从缓冲区读取下一个字节并将其发送到UART硬件时,PIC会触发外设中断.
以下是源代码的概念:
uart_isr.c
//*************** Interrupt Service routine for UART2 Transmission
void __attribute__ ((interrupt,no_auto_psv)) _U2TXInterrupt(void)
{
//the UART2 Tx Buffer is empty (!UART_TX_BUF_FULL()), fill it
//Only if data exists in data buffer (!isTxBufEmpty())
while(!isTxBufEmpty()&& !UART_TX_BUF_FULL()) {
if(BT_CONNECTED)
{ //Transmit next byte of data
U2TXREG = 0xFF & (unsigned int)txbuf[txReadPtr];
txReadPtr = (txReadPtr + 1) % TX_BUFFER_SIZE;
}else{
break;
}
}
IFS1bits.U2TXIF = 0;
}
Run Code Online (Sandbox Code Playgroud)
uart_methods.c
//return false if buffer overrun
BOOL writeStrUART(WORD length, BYTE* writePtr)
{
BOOL …Run Code Online (Sandbox Code Playgroud) 所以我尝试将硬件NSS信号与HAL库一起使用,但我找不到任何使NSS引脚具有低电平或高电平的功能.我也试图在HAL文档中找到答案,但也没有任何信息.Internet中的所有示例仅包含NSS软件.如何使用硬件NSS?
我希望开始简单的硬件开发,并希望进步足以从逆向工程中学习.
我想从一个微控制器开始,并考虑一些,如Mbed和Arduino.我该怎么办?
我想也许是mbed,因为它有USB和以太网功能,还有其他几个,但我真的不知道Arduino有什么.公共汽车盗版(因为它更便宜)也会起作用吗?
我真的不想基本编程; 我目前的视差控制器很痛苦!
通常,在运行RTOS的SBC中,将数据/事件日志写入诸如SD卡的外部媒体是一件容易的事.然而,在使用微控制器的嵌入式系统中,例如PIC微芯片,具有有限的数据/程序存储器.虽然有些芯片组支持外部媒体,但假设没有,那么如何登录MCU呢?
我能想到的唯一可行的方法是将其写入MCU的EEPROM,但这是否可行?如果可以这样做,那么如何写和读?
我有一些非空构造函数的全局实例的简单声明.这些构造函数在启动期间自动调用.我在Linux上交叉编译C++到不同的微控制器目标.
至于
对构造函数的调用将放入该.init_array部分.地图文件如下所示:
.init_array 0x00007cb8 0x4 libmotor.o
.init_array 0x00007cbc 0x4 libaudio.o
至于
这些调用进入该.ctors部分:
.ctors 0x000000009d011508 0x4 libmotor.o
.ctors 0x000000009d01150c 0x4 libaudio.o
编译完成后-ffunction-sections -fdata-sections,链接器得到了--gc-sections.
所有二进制文件都可以工作,但我想将所有调用放在同一部分(以简化链接器脚本的维护).
我正在32位cortex m4微控制器上编写函数.该函数必须能够乘以不同大小的矩阵,这是我无法预测的.所以我必须使用malloc ......
但我不明白为什么我的mc在执行以下行时总是进入默认处理程序中断:
double *output2=NULL;
output2 = malloc(3 *1* sizeof(double *));
Run Code Online (Sandbox Code Playgroud)
这个mc是不是能够处理这种类型的操作?虽然这在我的笔记本电脑上工作得很好!
**编辑*
这里有一些更多的代码(仍然需要修改......):好吧所有的malocs都失败了.我无法为"malloced"数组赋值.
int main (void)
{
/*some stuff*/
float transFRotMatrix[3][3]={0}; //array gets modified by other functions
float sunMeasurements[3][1] = {{1},{2},{3}}; //test values
multiplyMatrices( &transFRotMatrix[0][0],3, 3, &sunMeasurements[0][0], 3, 1, *orbitalSunVector);
/*some stuff*/
}
void multiplyMatrices(float *transposedMatrix, int height1, int width1, float *iSunVector,int height2, int width2, float *orbitalSunVector)
{
int y=0;
int x = 0;
int row=0;
int column =0;
int k=0;
int k2 = 0;
float result = …Run Code Online (Sandbox Code Playgroud) 我有一个在基于ARM Cortex-M的MCU上运行的应用程序,用C和C++编写.我使用gcc并g++编译它,并希望完全禁用任何堆使用.
在MCU启动文件中,堆大小已经设置为0.除此之外,我还想禁止在代码中使用任何意外的堆.
换句话说,我想接头(和/或编译器),以给我一个错误时malloc,calloc,free功能或new,new[],delete,delete[]运营商使用.
到目前为止,我已经尝试过-nostdlib这样的问题undefined reference to _start.我也尝试过,-nodefaultlibs但是当我试着打电话时,我仍然没有抱怨malloc.这样做的正确方法是什么?
笔记: