当前位置:首页 » 编程语言 » pgm读取c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

pgm读取c语言

发布时间: 2022-09-08 07:17:24

A. c语言中怎么读取flash内容

  1. flash是存储芯片的一种,通过特定的程序可以修改里面的数据。FLASH在电子以及半导体领域内往往表示Flash Memory的意思,即平时所说的“闪存”,全名叫Flash EEPROM Memory。
    Flash存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还可以快速读取数据(NVRAM的优势),使数据不会因为断电而丢失。U盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码,或者直接当硬盘使用(U盘)。
    目前Flash主要有两种NORFlash和NANDFlash。NORFlash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NORFLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。NANDFlash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。用户不能直接运行NANDFlash上的代码,因此好多使用NANDFlash的开发板除了使用NANDFlash以外,还加上了一块小的NORFlash来运行启动代码。
    一般小容量的用NORFlash,因为其读取速度快,多用来存储操作系统等重要信息,而大容量的用NANDFLASH,最常见的NANDFLASH应用是嵌入式系统采用的DOC(Disk On Chip)和我们通常用的“闪盘”,可以在线擦除。目前市面上的FLASH主要来自Intel,AMD,Fujitsu和Mxic,而生产NANDFlash的主要厂家有Samsung,Toshiba,Micron和Hynix。

  2. 片内flash还是片外flash,spi接口还是其他的接口。ARM片子不一样,答案就不一样。根据flash手册,按照手册写驱动。

B. 在读取PGM图像时,无法显示24行扫图像像素

ppm文件是一种图像文件,有其自己的文件格式。ppm文件由两个部分组成:第一个部分是三行ASCII码,这个部分决定了图像的存储格式以及图像的特征;第二个部分就是图像的数据部分,图像就是由这个部分组成的。
ppm的第一部分由三行ASCII码组成
第一行是P2/P3/P6
第二行是图像的大小,先是列像素数,后是行像素数,中间有一个空格
第三行是一个介于1和65535之间的整数,而且必须是文本的,用来表示每一个像素的一个分量用几个比特表示。
三行之后是图像的数据流,从左到右,从上到下。在进行图像数据存储的时候,需要进行数据的格式,假如需要的像素值在0~255之间,那么在进行数据文件保存的时候,所写入文件的值就必须是以%c的形式输入,而且数据之间没有明显的分离字符,图像处理软件会自动地识别这些像素的值,并给予处理。
PPM->Portable PixMap
PGM->Portable GreyMap
PBM->Portable BitMap
PBM支持单色图(1个像素位)
PGM支持灰度图形,能够读PBM图形和PGM图形,输出PGM图形
PPM支持真彩色图形,可以读上面所有格式,输出PPM图形
PPM图形文件格式包括两个部分,头部分和图象数据部分。头部分由三部分组成,这三部分由回车或换行分割,但PPM的标准中是要求空格。第一行通常是P3或P6,说明是PPM格式;第二行是图象的宽度和高度,用ASCII来表示;最后一部分是描述像素的最大颜色组成,这里允许描述超过一个字节(0-255)的颜色值。另外可以在上面个部分的后面用#来追加注释,注释行是从#到该行末

C. 哪位高手知道PGM文件格式的具体介绍啊急用!

*.PGM是AS/400上的程序,类似其它平台的所谓可执行文件。可执行文件这种叫法对AS/400来讲有点别扭,400上叫目标。*.PGM是程序目标,从源程序编译而来,可以直接运行

D. C语言中如何验证常量'abcd'在内存中如何存放呢在gcc中,输出‘abcd’的结果是‘c’

初学者很难搞懂这一点的,仅凭三言两语是说不清的,这里的复杂性,我少说可以给你讲上两三天。不同的操作系统分配内存不同,不同的开发语言也是一样,所以,你别想在这里一下子明白。
以c语言来说,分配内存和你的定义类型有关。输出值是你赋值有关,好像是费话。
类型有很多种,赋值也一样。
关键问题是出在赋值类型与定义类型不符,还有就是溢出(不考虑算法逻辑错误);
通常研究这个是为排错用的。
首先,要明白
一个字节是一个byte就是8个bit,即 B
每一个byte在内存中都有自己的一个地址,由低到高,通常我们用十六进制表示。
所以,你通常会见到有这么写的0xff 0xdd 0x3a这样的,每一个代表占用一个内存。
0xeeff像这样的是占用了两个内存。
这样就出现在有高地址与低地址之分,在不同的系统,语言中都可能存在不同。
int i=0xeeff
这样,就有两种可能 ,ee是高位,存放到高地址,ff是低位存放到低地址,
另一种是高位的ee存放到低地址里,仰慕位的ff存放到高地址里。
用以下代码测试:
#include <stdio.h>
int main()
{
char *p,*q;
int i=0xeeff;
p=&i;

printf("add=0x%x,ch=0x%x\n",p,*p);
p++;
printf("add=0x%x,ch=0x%x\n",p,*p);
}

输出:
add=0x000000,ch=0xeeff
add=0x000000,ch=0xff
add=0x000001,ch=0xee

真正地址不是这个,我只是表示一下。

查看内存中是什么,通过指针来控制,设计你需要的测试代码。

32位cpu内存地址访问最大内存空间 32bit=0xFFFFFFFF=4G(约)
还有一些深的东西就不多说了。

你的问题中一会儿说常量,一会儿又说变量的,我还得猜的你问题。
再有,你看的书上说,我想你只是记忆吧,记的不全,你只问出一半问题来。
所以我也只能为你回答一半了。要是我把所有可能帮你设计一回,再讲上讲,看三五天我也写不完了。

E. 在AVR GCC中如何使用C语言在程序空间申请常量数组就像在KEIL中使用CODE或者PCODE的功能。

GCC中把大数组存入flash区的方法大全

AVRGCC中将变量定义在flash空间的方法(大数据存储)

(1)flash常量:

#include <avr\pgmspace.h>//须增加的头文件

const prog_uchar FlashConst = 3; //定义uchar型的常量n定义在flash里(flash常量)

unsigned char RamVar; //定义无符号整型变量(Ram变量)

RamVar = pgm_read_byte(&FlashConst); //读取flash常量到ram变量

(2)flash一维数据:

#include <avr\pgmspace.h>

const prog_uchar s[5] = { 1, 2, 3, 4, 5 };

unsigned char RamVar; //定义无符号整型变量(Ram变量)

RamVar = pgm_read_byte( &s[1] ); //读取s[1]的值到RamVar, or RamVar = pgm_read_byte( s+1 );

(3)flash多维数据:

#include <avr\pgmspace.h>

const prog_uchar s[4][16] = { {14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7 },
{ 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8 },
{ 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0 },
{15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13 }
};

unsigned char RamVar[4],[16]; //定义无符号整型变量(Ram变量)

register char i, j;

for(i=0; i<4; ++)

{

for(j=0; j<16; j++)

{

RamVar[i][j] = pgm_read_byte( &s[i][j] ); //读取数组s的值到RamVar

}//end for 2

}//end for 1

(4)扩展部分

avr对ram和flash是独立编址的,ram是按8位编址,而flash却按16位编址,读ram和读flash的汇编指令也是不同的。

类似flash数据类型还有:prog_void 、prog_char 、prog_int8_t、prog_uint8_t、prog_int16_t、prog_uint16_t、prog_int32_t、prog_uint32_t等。

读取指令pgm_read_xxx宏定义其实就是一段包括了flash读取指令的内联汇编代码。函数原型为:pgm_read_byte(address_short)、pgm_read_word(address_short)、 pgm_read_dword(address_short)、pgm_read_float(address_short)。括号中是地址值。

F. 请问PGM可否打开MDL的设计格式啊 如有同行知道请教教我啊!谢谢!

不能直接打开的,可考虑让MDL文件先转换为公共DXF格式,再让PGM来读取。
我们在上海和周边地区销售服装绘图仪。读图板,切割机等
你也在附近可联系我们,可随机器提供转换软件和操作培训

联系我 可看我名字

G. 向单片机高手求助,怎样用C语言编写歌曲程序和歌曲代码需要用那些工具怎么样编写的要求详细解答。谢谢!

//绝对调试通过,AVR-GCC,mega16,带数码显示,单键开关多功能控制
#include <avr/io.h>
#include <avr/interrupt.h>
#include <tone.h>
#include <avr/pgmspace.h>
#define uchar unsigned char
#define uint unsigned int
#define key_input PINA
#define pgm16(A) ((typeof(A))pgm_read_word(&(A)))
const unsigned char seg_code[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x7f,0x3f};
const uint music[] PROGMEM={M3,F2,M5,B1,M3,F4,M2,F4,M1,B2,L6,F2,M1,F2,MM,M1,F2,L6,F2,L5,B2, L6,F2,M1,B1,MM,M1,F2,L6,F2,M6,F2,L5,F2,M3,F2,M2,F2,MM,M2,F4,M1,F4,L6,F2,M3,F2,M2,B2,
M3,F2,MM,M3,F2,MM,M3,F2,M2,F2,M1,B2,L6,F2,M1,F2,L7,F2,L5,F2,L6,B2, L5,F2,L6,F2,MM,L6,F2,L5,F2,M6,F2,M5,F2,MM,M5,F2,M3,F2,M2,F2,MM,M2,F4,M3,F4,M3,F2,M2,F2,M1,B2,
M6,F2,H1,B1,M6,F2,H2,F2,H1,F2,MM,H1,F2,M6,F2,MM,M6,F2,M5,F2,MM,M5,F2,M3,F2,M5,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,F2,MM,H1,F2,M6,F2,M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,B2,
M3,B1,MM,M3,F2,M5,F2,M6,F2,M5,F2,MM,M5,F2,M3,F2,MM,M3,F2,M2,F2,MM,M2,F2,M1,F2,L6,B2, L5,F2,M5,F4,MM,M5,F4,MM,M5,F2,M6,F2,M5,F2,M3,F2,M2,F2,M3,F2,MM,M3,F2,M2,B1,L6,F2,M1,B2,
M6,F2,H1,B1,M6,F2,H2,F2,H1,B1,M6,F2,MM,M6,F2,M5,F2,MM,M5,F2,M3,F2,M5,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,B1,M6,F2,
M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,B2,MM, M2,F2,MM,M2,F4,M1,F4,M2,F2,M3,F2,M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,F2,MM,M2,F4,M3,F4,M2,F2,M1,F2,L6,B2,
L5,F2,M5,F4,MM,M4,F4,MM,M5,F2,M6,F2,M5,F2,M3,F2,M2,F2,M2,F4,M3,F4,MM,M3,F2,M2,B1,L6,F2,M1,B3,0XFF,0XFF};
//因为两个相同的音符之间无停顿,人为插入了MM(极短暂的

volatile uint i=1;
volatile uchar timeOK=0;
uchar key_scan(void);

ISR(TIMER0_COMP_vect) //CTC模式,控制音调高低
{
OCR0=pgm16(music[i-1]);

}

ISR(TIMER1_OVF_vect) //时间溢出模式,控制节拍长短
{

i+=2;
TCNT1H=(65536-pgm16(music[i]))/256; //相当于(65536-beat[i])/256
TCNT1L=(65536-pgm16(music[i]))%256; //相当于(65536-beat[i])%256
if(pgm16(music[i])==0xff)i=1; //在音调数组的最后加一个0xff,作为终止信号
if(pgm16(music[i])==0x00)TIMSK&=(~(1<<OCIE0));
else TIMSK|=(1<<OCIE0);
}

ISR(TIMER2_OVF_vect) //时间溢出模式,用于检测按键,周期10ms
{
TCNT2=100;
timeOK=1;

}

void timer0_init(void)
{
TCCR0=0x00;
TCNT0=0x00;
OCR0=pgm16(music[i-1]);
TCCR0=0x1a;
//TIMSK|=(1<<OCIE0);
}

void timer1_init(void)
{
TCCR1B=0x00;
TCNT1H=(65536-pgm16(music[i]))/256;
TCNT1L=(65536-pgm16(music[i]))%256;
TCCR1A=0x00;
TCCR1B=0x05;
//TIMSK|=(1<<TOIE1);
}

void timer2_init(void)
{
TCCR2=0x00;
TCNT2=100;
TCCR2=0x03;
TIMSK|=(1<<TOIE2);
}

void MCU_init(void)
{
DDRA=0X00;
DDRB=0X00;
DDRC=0XFF;
DDRD=0XFF;
PORTB=0X00;
PORTC=0xfe;
PORTD=0xff;
}

uchar key_scan(void) //按钮扫描函数
{
static uchar key_state=0,key_time1=0,key_time0=0; //静态变量,调用以后,值被保留;
uchar key_press,key_return=0;
key_press=(~key_input)&0x01; //有键1,无键0

switch(key_state) //状态机
{
case 0: //状态0:无按钮按下状态
if(key_press)key_state=1;
break;
case 1: //状态1:检测到有按钮被按下
if(key_press) //按钮仍按下,转2
{
//TIMSK^=(1<<TOIE0);
key_state=2;
key_time1=0; //按下时间初始
}
else //按钮已经释放,消抖
key_state=0;
break;
case 2: //状态2:等待释放或等待按下时间达到长按要求
if(!key_press) //按钮已经释放,转3,继续判断是双按还是单按
{
key_state=3;
key_time0=0; //释放时间初始
}
else if (++key_time1>=100) //按下时间达到1000ms,返回值2,作长按判断,转7等待按钮释放
{
key_state=8;
key_time1=0;
key_return=2;
}
break;
case 8:
if(!key_press)
{
key_state=0;
key_time1=0;
}
else if (++key_time1>=50)
{
key_return=2;
key_time1=0;
}
break;
case 3: //状态3:双按的第二次按钮输入前的等待间隙,设定100ms(经过测试,100ms为比较合适的时间间隙,即为人体普通可以双击的速度
if(key_press)key_state=4; //在此时间,如果有按钮被按下,将当作释放抖动,转4进一步作出判断
else if (++key_time0>4) //如果没有按钮被按下,则等待此100ms过去,然后转5
{
key_state=5;
key_time0=0;
}
break;
case 4: //状态4:第二按的消抖处理
if(key_press)key_state=2; //快速连按(被认为人手指达不到要求的速率)将被返回到2,当作第一按处理
else key_state=3; //如果第二按只出现一次,不到10ms,消抖
break;
case 5: //状态5:第二按前等待时间到达,进入正常的第二按等待输入状态,第二按只允许在此时间内输入方为有效
if(key_press)key_state=6; //此时间内有被按下,转6,判决抖动;
else if(++key_time0>14) //无输入,则等待输入有效时间过去,时间满后,判定为单按,返回值1,状态位回到0
{
key_state=0;
key_time0=0; //双击间隔时间一般为100ms,能够稳定做到第二击完成时间总共约180~200ms(因人而异)
key_return=1; //为增加采样成功率,可适当缩短第二按前的间隙时间,增加第二按等待输入时间,但总时间不可短于150ms
} //小于150ms,手指将很难达到双击的速度要求,如果时间太长则单按判断时间过长,按钮不灵敏,此处180ms经测试较为合适
break;
case 6: //状态6:第二按的抖动判断
if(key_press) //按钮仍有效,按下有效,返回3,双按成立,转7等待按钮释放
{
key_state=7;
key_return=3;
}
else key_state=5; //抖动消除,退回5继续等待输入或等待输入有效时间过去
case 7: //按钮释放等待状态,所有已按下并被识别操作目的的按钮状态都将转到7等待按钮释放,并将所有计时初始
if(!key_press)key_state=0;
key_time1=0;
key_time0=0;
break;

}
return key_return;
}

int main(void)
{

MCU_init();
timer0_init();
timer1_init();
timer2_init();
sei();

while(1)
{
if(timeOK)
{
cli();
uchar key;
key=key_scan();
if(key>0)PORTD=seg_code[key];
switch(key)
{
case 1:
TIMSK^=((1<<OCIE0)|(1<<TOIE1)); DDRB^=(1<<DDB3); PORTC=0xfd;
break;
case 2:
//TIMSK|=((1<<OCIE0)&(1<<TOIE1));
if(i>1)i+=10;
if (i>=(sizeof(music)-20))
{
i=1;
TIMSK&=(~((1<<OCIE0)|(1<<TOIE1)));
DDRB&=~(1<<DDB3);
}

PORTC=0xf0;
break;
case 3:
TIMSK&=(~((1<<OCIE0)|(1<<TOIE1)));
i=1;
TIMSK|=((1<<OCIE0)|(1<<TOIE1));
PORTC=0xfe;
break;
default:
break;
}
timeOK=0;
sei();
}
}

}

H. c语言 强制类型转换 (unsigned char(*)(unsigned int))(PGM) 其中PGM是一个数组 这个最终转换成什么类型啊

函数指针类型,该指针能指向一个函数, 该函数返回值是unsigned char, 且带有一个unsigned int的参数。

I. C语言 类型转换

不是有强制类型转换吗?

强制类型转换 强制类型转换
当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类型转换,将操作数转化为所需要的类型。强制类型转换具有两种形式,称为显式强制转换和隐式强制类型转换。
1、显式强制类型转换
显式强制类型转换需要使用强制类型转换运算符,格式如下:
type(<expression>)

(type)<expression>
其中,type为类型描述符,如int,float等。<expression>为表达式。经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变,例如:
int nVar=0xab65;
char cChar=char (nVar);
上述强制类型转换的结果是将整型值0xab65的高端两个字节删掉,将低端两个字节的内容作为char型数值赋值给变量cChar,而经过类型转换后nVar的值并未改变。
2、隐式强制类型转换
隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回,如:
int nVar;
double dVar=3.88;
nVar=dVar;//执行本句后,nVar的值为3,而dVar的值仍是3.88

1,若已知x,y为double类型,则表达式:x=1,y=x+3/2结果是多少啊?

因为x,y都是double型,所以执行了y=x+3/2这个语句后,会输出小树部分,double型默认的是小数点后几位我忘了,你自己调试下,就会明白了!
是否可以解决您的问题?

J. c语言中:一个文件夹下有 pgm.h main.c fct.c pm.c,都编译好的,如何一起执行这三个文件

不可能说一起“执行”这三个文件,只能有一个入口点(main函数——现在有tmain wmain等但本质都是程序开始执行的起点)
只要放在一个工程里,有适当的include关系,编译器能链接上里面的函数