Tag: 微控制器

我可以在Microchip C18中创建一个接受ram和rom指针的函数吗?

当我声明一个接受const char*的函数并且我传递一个字符串文字时,我得到一个 警告:[2066]类型限定符在分配中不匹配 因为字符串文字是rom const char* 。 反过来也是这样。 尽管PIC是哈佛架构,但内存映射到一个连续的地址空间,因此理论上应该可以同样的方式支持ram和rom指针。 可能我必须使用rom指针,因为它们是24位而ram指针是16位。 但是,只是将const char*转换为const rom char*不起作用。

我在哪里可以找到软乘法和除法算法?

我正在研究一种没有硬件乘法和除法的微控制器。 我需要为这些基本操作制作软件算法,这是紧凑尺寸和效率的良好平衡。 我的C编译器端口将使用这些算法,而不是C开发人员自己。 我的google-fu到目前为止主要是关于这个主题的噪音。 谁能指点我的信息? 我可以使用add / sub和shift指令。 基于表查找的算法也可能对我有用,但我有点担心编译器的后端这么多……嗯,可以这么说。

当嵌入式编译器没有运算符new或STL支持时,如何进行C ++?

我正在为我的大学开展一个小组高级项目,并且在尝试让我的代码工作时遇到了一个主要障碍。 我们的8位Atmel微控制器的编译器不支持new或delete运算符,它不支持C ++ STL。 我可以用C编程,但是我必须实现一个我从未做过的A *算法。 虽然我最初尝试过C,但我很快意识到我之前从未做过纯C。 尝试使用结构和函数对对象进行建模正在减慢我的速度,因为我已经习惯了更清晰的C ++语法。 无论如何,我的编译器缺点的确切措辞可以在这里找到: http : //www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus 为了克服它们并仍然使用C ++,我考虑了以下可能性。 1)不要分配任何东西,只需使用模板在堆栈上生成固定数组。 2)在为对象分配空间后,分配并找到一些hack来调用对象的构造函数。 由于new不是运营商,因此不能选择新的展示位置。 3)只需使用C并将其吸收,它是一个微控制器为什么我喜欢它? 4)找到一个更好的编译器,可能会花费$$$。 第二个选项是最难的,但就我如何编写此代码而言,它将获得最大的回报。 但是,我想如果我弄错了调试它可能是一个巨大的痛苦。 我正在考虑在堆栈上创建对象,将它们的位复制到分配的空间中,然后将对象中的位清零,这样它就不会调用它的析构函数。 为此,我将使用unsigned char指针和sizeof运算符直接访问这些位以获取字节数。 这听起来很糟糕,我不知道它是否可以正常工作,但我正在考虑它。 我知道vtable可能有问题,但我不打算使用任何vtable,因为它只是一个8位微控制器。

更快的16位乘法算法,适用于8位MCU

我正在寻找一种算法来乘以两个比下面更好的整数。 你有一个好主意吗? (MCU – AT Tiny 84/85或类似 – 此代码运行的地方没有mul / div运算符) uint16_t umul16_(uint16_t a, uint16_t b) { uint16_t res=0; while (b) { if ( (b & 1) ) res+=a; b>>=1; a+=a; } return res; } 当使用avr-gcc编译器为AT Tiny 85/84编译时,该算法几乎与avr-gcc生成的算法__mulhi3相同。 avr-gcc算法: 00000106 : 106: 00 24 eor r0, r0 108: 55 27 eor r21, r21 10a: 04 […]

__CC_ARM,__ ICC __,__ GNUC__和__TASKING__宏是什么意思?

我正在通过stm研究STM32l151rct6a,我偶然发现了这些MACRO定义 __CC_ARM, __ICCARM__, __GNUC__, __TASKING__ 有谁知道他们的意思?

开始编写除计算机以外的其他东西的最佳方法?

开始在计算机外编程的最佳方法是什么? 我不是指像API这样的手机这样的主流产品。 请假设有C / C ++的工作知识

C8051f312微控制器

我不是很擅长C语言,但我已经为C8051F312微控制器编写了一个非常简单的代码。 我的代码不起作用。 请帮帮我,我错了什么。 #include C8051F310.h #include stdio.h sbit LED_16 = P1^7; // green LED: 1 = ON; 0 = OFF void init(void) { // XBRN registers_init XBR0 = 0x00; XBR1 = 0x00; // Enable the crossbar PCA0MD = 0X00; // port_init P0MDOUT = 0x00; // Output configuration for P0 P1MDOUT = 0x40; // Output configuration […]

C中任何更快的RMS值计算?

我正在用C编写一个小型8位微控制器的软件。部分代码是读取电流互感器(ZCT)的ADC值,然后计算RMS值。 流过ZCT的电流是正弦曲线但可能会失真。 我的代码如下: float adc_value, inst_current; float acc_load_current; // accumulator = (I1*I1 + I2*I2 + … + In*In) double rms_current; // Calculate the real instantanous value from the ADC reading inst_current = (adc_value/1024)*2.5; // 10bit ADC, Voltage ref. 2.5V, so formula is: x=(adc/1024)*2.5V // Update the RMS value with the new instananous value: // Substract […]

Arduino中断替代方案

从我所读到的,我的问题的解决方案是使用中断,但如果我正确理解它,我不能在中断调用的例程中使用延迟。 我有一个大按钮LED开关。 我希望它在闲置时有一个心跳,但是一旦它被按下,保持绿色并执行代码。 如果我按下按钮足够次,我可以打破heartbeat() (我假设在正确的时间完成状态更改,因为它完成了heartbeat的循环),但我仍然坚持如何让它在第一次工作单击。 有没有其他方法来做我正在尝试的事情? void loop(){ heartbeat(); //Make LED beat. buttonVal = digitalRead(buttonPin); //Check the button. if (buttonVal != buttonState) { //If the button state changed. if (buttonVal == HIGH){ //Check if the button is pressed. analogWrite(greenPin, 255); //Button stays green once pushed. functionA //Has some delays in it. functionB //Has some other […]

在C中转换为ASCII

使用微控制器(PIC18F4580),我需要收集数据并将其发送到SD卡以供以后分析。 它收集的数据的值介于0和1023之间,或者0x0和0x3FF之间。 所以我需要做的是将1023转换为基本的10个字符串ASCII值(0x31,0x30,0x32,0x33,…)。 我的问题是,我能想到的将数字分开的唯一方法需要进行大量的划分。 char temp[4]; temp[0] = 1023 % 10; temp[1] = (1023 % 100) / 10; temp[2] = (1023 % 1000) / 100; temp[3] = (1023 % 10000) / 1000; 使用此方法,查找n位十进制数的ASCII值需要2n-1个除法。 有没有更快的方法? 最终目标是结束SD卡上的.csv文件,该文件可以快速插入任何笔记本电脑,以查看Excel中的数据图表。