我的公司正在从汇编编码微控制器转换到C.我们正在考虑Microchip,Atmel,Renasas等.人.用于未来使用C代码的项目.是否有良好的培训资源可以让我们的工程师快速掌握C?研讨会,讲师,课程等.工程师的经验水平从无培训到知识各不相同.
中继控制器和微控制器有什么区别?
我正在研究Arduino电路板,我刚刚进入电子产品领域,所以我想了解其中的不同之处.
我知道这不是一个编程问题,但我正在开发PHP,并想知道在开始编码之前有什么区别,以确保我走的正确路径.
我们的一个协处理器是一个8位微处理器.它的主要作用是控制处理闪存的硬件.我们怀疑它运行的代码非常低效,因为我们在读/写闪存时测量了低速.问题是,我们只有一个J-TAG端口连接到主CPU,因此调试它不是一个选项.我们所拥有的是一个可从CPU获得的寄存器,其中包含微处理器的程序计数器.坏消息是,微处理器的工作频率与CPU不同,因此监控外部的程序计数器也很困难.测量微处理器内部的时间也非常困难,因为它的寄存器只有8位长.不用说,代码是汇编而且非常复杂.你会如何解决这个问题?
我用C(gcc)编写STM32F4,它是一个ARM Cortex M4,我看到所有的例子都用无限循环完成了main()函数,即使程序的其余部分都是从中断执行的.如果我尝试从程序中删除循环,则中断也会停止.
为什么我不能删除此循环并退出主线程?
这是集会(我猜它是拇指,但我不能读,即使有文档):
LoopFillZerobss:
ldr r3, = _ebss
cmp r2, r3
bcc FillZerobss
/* Call the clock system intitialization function.*/
bl SystemInit
/* Call the application's entry point.*/
bl main
bx lr
.size Reset_Handler, .-Reset_Handler
Run Code Online (Sandbox Code Playgroud) 我怀疑,在所有微控制器中,闪存更多是ram(例如:atmega16它是16k,但RAM只有1 Kb)..
那么,如何执行代码,CPU是否直接从Flash本身执行,如果是,那么是否使用了给出的那个小RAM.
在这个程序中我得到错误,在C ..\async.obj中复制符号"_buf_position"我已经将buf_position声明为全局变量我不知道这段代码有什么问题,有人可以看看.
//async.h文件
extern uint8_t buffer[10];
extern uint32_t buf_position = 0;
extern uint8_t local_buff[10];
extern uint32_t retVal;
Run Code Online (Sandbox Code Playgroud)
//async.c文件
#include "async.h"
void Transmit_Data(void)
{
.............
...........
}
void Excep_SCI0_RXI0(void)//This is a recive interrupt,when some data is available on serialport
{
buffer[buf_position++]= SCI0.RDR;
}
Run Code Online (Sandbox Code Playgroud)
// main.c
#include "async.h"
void main(void)
{
while(buffer[buf_position-1]=='\r')
{
memcpy(local_buff,buffer,buf_position-1);
Display_LCD(LCD_LINE1, local_buff);
Transmit_Data();
buf_position = 0;
//memset(buffer,0,sizeof(buffer));
}
}
Run Code Online (Sandbox Code Playgroud) 假设有
function f(int8_t a, int8_t b) // a b only need 8 bits
Run Code Online (Sandbox Code Playgroud)
另一种选择是:
function f(int32_t a, int32_t b) // a b only need 8 bits
Run Code Online (Sandbox Code Playgroud)
它运行在32位MCU,如ARM Cortex_M.哪个是关于所需代码大小,数据大小和执行效率的更好选择?
如果在8位MCU如8051,那int8_t应该更好吧?
为什么当我们为寄存器写入地址时,我们将偏移量添加到基址?
另外我们为什么要编写如下语法
#define CGPIO (*((volatile unsigned long*)0x400FE608));
Run Code Online (Sandbox Code Playgroud)
我的意思是指针部分语法
我有这个C程序,我在代码作曲家工作室写.
#include <msp430.h>
/*
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
int R5_SW=0, R6_LED=0, temp=0;
P1OUT = 0b00000000; // mov.b #00000000b,&P1OUT
P1DIR = 0b11111111; // mov.b #11111111b,&P1DIR
P2DIR = 0b00000000; // mov.b #00000000b,&P2DIR
while (1)
{
// read all switches and save them in R5_SW
R5_SW = P2IN;
// check for read mode
if (R5_SW & BIT0)
{
R6_LED = R5_SW & (BIT3 | BIT4 | BIT5); // copy the pattern from …Run Code Online (Sandbox Code Playgroud) 我有这个代码不起作用的问题.. ISR正在工作..我在其他代码中测试了它的闪烁..
但是要将x ++放在ISR中并在main()函数中读取X,它永远不会闪烁...
我不熟悉asm我认为这是编译器optomization所以我把变量挥发,但它没有工作..
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
volatile static uint8_t x = 1;
ISR( TIMER0_OVF_vect )
{
x++;
reti();
}
int main(void)
{
/* Replace with your application code */
DDRB = DDRB | 0B00100000 ; // pinMode(13,OUTPUT);
TCCR0A = 0;
TCCR0B = (1 << CS00 ) | (1 << CS02 ); //1024 prescaler
TIMSK0 |= 1 << TOIE0 ;
sei();
while (1)
{
if (x >= 61) //never happens ?
{
PORTB …Run Code Online (Sandbox Code Playgroud)