错误在这一行:
dataArray[iLedMatrix][iRow] |= (byte)(bufferPattern[iRow]) & (1<<7);
Run Code Online (Sandbox Code Playgroud)
dataArray是:byte dataArray [NUMBER_LED_MATRIX] [NUMBER_ROW_PER_MATRIX];
bufferPattern是:const patternp*bufferPattern;
patternp是类型的typedef:typedef prog_uchar patternp [NUM_ROWS];
我在参考文献中可以看到prog_uchar是1个字节(0到255).所以我不明白失去精度的错误?任何的想法?
在我的AVR上,我有一个字符数组,它以{R,G,B,x,R,G,B,x,...}的形式保存颜色强度信息(x是未使用的字节).有没有简单的方法来写一个long int(32位),char myArray[4*LIGHTS]所以我可以轻松写一个0x00BBGGRR数字?
我的类型转换是粗糙的,我不知道如何写它.我猜测只是制作一个指向long int类型的指针并将其设置为等于myArray,但后来我不知道如何随意告诉它将group x设置为myColor.
uint8_t myLights[4*LIGHTS];
uint32_t *myRGBGroups = myLights; // ?
*myRGBGroups = WHITE; // sets the first 4 bytes to WHITE
// ...but how to set the 10th group?
Run Code Online (Sandbox Code Playgroud)
编辑:我不确定类型转换是否是正确的术语,因为我认为如果它只是将32位数字截断为8位?
我有一个AT90USB162 AVR芯片,我想运行多任务RTOS,所以我正在评估可能的RTOS与我的AVR芯片一起使用.AVR支持哪些多任务RTOS?也许是QNX?(是否可以在AVR微芯片上运行QNX内核?).
提前致谢.
我是AVR编程的新手.uint8_t received_msg如果它等于,我想控制一个变量()0xFF.这样做是否正确:
if (!(received_msg ^ 0xFF))
Run Code Online (Sandbox Code Playgroud)
或者我需要逐点比较
uint8_t test = 0;
test = received_msg ^ 0xFF
for (i =0; i<8; i++){
test = 0 & (1<<received_msg)
}
if(test==0)
Run Code Online (Sandbox Code Playgroud) 我有一个avr程序,我想使用指向方法的指针.但为什么使用函数指针超过正常调用几乎慢4倍?我该如何加快速度呢?
我有:
void simple_call(){ PORTB |= _BV(1); }
void (*simple)() = &simple_call;
Run Code Online (Sandbox Code Playgroud)
然后如果我用-O3编译并调用:
simple_call()
Run Code Online (Sandbox Code Playgroud)
完成需要250ns.如果我改为打电话:
simple()
Run Code Online (Sandbox Code Playgroud)
完成需要960ns!
我怎样才能让它更快?
在下面,您可以看到我用Codevision(C语言)编写的整个程序.当我想编译它时,我收到一些Switch块的错误!我很确定我的块的形式是正确的!你能看一下吗?
*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 12/17/2014
Author :
Company :
Comments:
Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*******************************************************/
#include <mega32.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
#include <stdint.h>
// Declare …Run Code Online (Sandbox Code Playgroud) 我使用的是avr-8位MCU.它的RAM大小为2K.我必须声明并使用大小为[16] [256]的int变量.这台机器上的int是2个字节.该阵列将消耗2*16*256 = 8k.这个尺寸是不可接受的,因为我只有2K RAM.
我必须使用这个二维数组来存储正在写入的闪存页面的状态.此数组将采用1或0值.1表示写入闪存中的页面,0表示不写入闪存中的页面.
我正在寻找如何存储此状态的解决方案.不确定位字段是否有用.
#include <avr/io.h>
#include <avr/interrupt.h>
int main()
{
DDRB|=0x82;
DDRC=0x00;
DDRD=0xFF;
TCNT1H=(-640)>>8;
TCNT1L=(-640);
TCCR1A=0X00;
TCCR1B=0X01;
TIMSK=(1<<TOIE0)|(1<<TOIE1)
sei();
PORTD=PINC;
}
ISR(TIMER1_OVF_vect)
{
TCNT1H=(-640)>>8;
TCNT1L=(-640);
PORTB^=0X80;
}
Run Code Online (Sandbox Code Playgroud)
请帮我解决TCNT1H=(-640)>>8; TCNT1L=(-640);代码....因为我一直在使用0-256的值,所以真的很混乱....
我在论坛中发现了以下代码,我想知道const限定符在其中的表现如何?
const uint8_t data[] = { 15, 3, 41, 76, 2, 9, 5 };
val = data[5];
Run Code Online (Sandbox Code Playgroud)
现在,据我所知,const限定符使变量成为data[]只读,因此,在此示例中,无法修改数组的内容.令我困惑的是,限定符被应用于数组,这是一个指针,因此可以修改数组的内容,但指针本身不能.
我是对的吗?或者数组的内容是只读的?
1.简介
我似乎无法找到有关FreeRTOS任务中以下函数之间行为差异的信息或详细解释:
2.代码
假设您有以下代码:
IdleHook +任务创建
Long value = 0;
void vApplicationIdleHook( void ) {
while(1)
{
// empty
}
}
int main(void)
{
xTaskCreate(TaskIncrement, (const portCHAR *)"up" , 256, NULL, 2, NULL );
xTaskCreate(TaskDecrement, (const portCHAR *)"down" , 256, NULL, 1, NULL );
vTaskStartScheduler();
}
Run Code Online (Sandbox Code Playgroud)
vTaskDelay的任务
static void TaskDecrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value--;
//semaphore give
}
vTaskDelay(100);
}
}
static void TaskIncrement(void *param)
{
while(1)
{ …Run Code Online (Sandbox Code Playgroud)