标签: microcontroller

用于8051微控制器的C++?

有人可以告诉我是否可以使用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++并且无法在其上找到任何内容.

c c++ embedded microcontroller 8051

8
推荐指数
2
解决办法
9161
查看次数

清除使用8位数据类型从0到255计数的代码

我想知道是否有一种使用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)

所以我想知道,有没有一种干净的方法来做到这一点,而不使用更大的数据类型?

编辑:

  • 我喜欢使用for的版本,因为它使得它的意图清晰而不考虑:从0循环到255.所有其他版本需要考虑一下发生了什么,因此更容易混淆其他版本.
  • 我不想使用int,因为代码是用于内存不多的8位微控制器.

c embedded microcontroller

8
推荐指数
3
解决办法
3042
查看次数

目前有非哈佛架构微控制器吗?

我已经使用过Atmel ATMEGA和ATTINY系列微控制器,并且认为它们相当不错.但我不太喜欢的一件事是它们(以及Microchip PIC uC系列)都是哈佛机器,这意味着我无法真正将外部存储器用于RAM或仅执行闪存.

虽然这种设计有明显的优势,但从技术上讲,使用AVR或PIC进行FORTH这样的操作非常困难.(我知道至少有一个实现,但它不像普通的FORTH那样工作,而且会很快耗尽闪存)

FORTH最初是为交互式机器控制类型系统创建的,需要很大的灵活性,因此Z80或6809之类的东西被用作控制程序执行的微控制器或RAM或其他存储设备.

有没有人知道von Neumman机器的AVR/PIC具有类似复杂性的当前设备(最好是在DIP封装中可用)?

microcontroller von-neumann 8-bit

8
推荐指数
2
解决办法
3456
查看次数

如何限制中断驱动的UART传输PIC24H?

我通过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)

c embedded microcontroller interrupt

8
推荐指数
1
解决办法
2440
查看次数

如何在stm32f4上使用硬件NSS(SPI)?

所以我尝试将硬件NSS信号与HAL库一起使用,但我找不到任何使NSS引脚具有低电平或高电平的功能.我也试图在HAL文档中找到答案,但也没有任何信息.Internet中的所有示例仅包含NSS软件.如何使用硬件NSS?

microcontroller arm spi stm32 stm32f4discovery

8
推荐指数
2
解决办法
3万
查看次数

开始硬件开发

我希望开始简单的硬件开发,并希望进步足以从逆向工程中学习.

我想从一个微控制器开始,并考虑一些,如Mbed和Arduino.我该怎么办?

我想也许是mbed,因为它有USB和以太网功能,还有其他几个,但我真的不知道Arduino有什么.公共汽车盗版(因为它更便宜)也会起作用吗?

我真的不想基本编程; 我目前的视差控制器很痛苦!

microcontroller reverse-engineering hardware-design

7
推荐指数
0
解决办法
655
查看次数

嵌入式系统中的事件记录

通常,在运行RTOS的SBC中,将数据/事件日志写入诸如SD卡的外部媒体是一件容易的事.然而,在使用微控制器的嵌入式系统中,例如PIC微芯片,具有有限的数据/程序存储器.虽然有些芯片组支持外部媒体,但假设没有,那么如何登录MCU呢?

我能想到的唯一可行的方法是将其写入MCU的EEPROM,但这是否可行?如果可以这样做,那么如何写和读?

c embedded microcontroller logging

7
推荐指数
1
解决办法
4813
查看次数

为什么GCC将对全局实例的构造函数的调用放入不同的部分(取决于目标)?

我有一些非空构造函数的全局实例的简单声明.这些构造函数在启动期间自动调用.我在Linux上交叉编译C++到不同的微控制器目标.


至于

  • 臂无 - EABI-GCC-4.8.4
  • rx-elf-gcc-4.8-GNURX_v14.03(GCC 4.8.3)

对构造函数的调用将放入该.init_array部分.地图文件如下所示:

.init_array 0x00007cb8 0x4 libmotor.o

.init_array 0x00007cbc 0x4 libaudio.o


至于

  • MIPS-ELF-GCC-4.8.2
  • AVR-GCC-4.8.1
  • MSP430-GCC-4.6.3

这些调用进入该.ctors部分:

.ctors 0x000000009d011508 0x4 libmotor.o

.ctors 0x000000009d01150c 0x4 libaudio.o


编译完成后-ffunction-sections -fdata-sections,链接器得到了--gc-sections.

所有二进制文件都可以工作,但我想将所有调用放在同一部分(以简化链接器脚本的维护).

  • 为什么有不同的目标部分?
  • 是否可以使用命令行选项更改默认部分?
  • 如果命令行选项没有退出:是否可以在GCC编译时定义默认部分?

c++ microcontroller gcc ld linker-scripts

7
推荐指数
1
解决办法
1813
查看次数

微控制器在malloc失败

我正在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)

c malloc microcontroller pointers

7
推荐指数
1
解决办法
474
查看次数

GCC:如何在MCU上完全禁用堆使用?

我有一个在基于ARM Cortex-M的MCU上运行的应用程序,用C和C++编写.我使用gccg++编译它,并希望完全禁用任何堆使用.

在MCU启动文件中,堆大小已经设置为0.除此之外,我还想禁止在代码中使用任何意外的堆.

换句话说,我想接头(和/或编译器),以给我一个错误时malloc,calloc,free功能或new,new[],delete,delete[]运营商使用.

到目前为止,我已经尝试过-nostdlib这样的问题undefined reference to _start.我也尝试过,-nodefaultlibs但是当我试着打电话时,我仍然没有抱怨malloc.这样做的正确方法是什么?

笔记:

  • 这个应用程序运行"裸机",没有操作系统.
  • 我还想避免在第三方代码中使用任何malloc(特定于供应商的库,标准库,printf等).
  • 我完全可以不使用需要动态内存分配的C/C++标准库部分.
  • 我更喜欢编译时而不是运行时解决方案.

heap microcontroller gcc arm g++

7
推荐指数
1
解决办法
1430
查看次数