也是J-Link取得的HEX資料,轉成影像格式,用來檢查資料。
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <windows.h>
#define SIZE (0x1000000)
#define WIDTH (672)
#define WIDTH_ALIG ((-(WIDTH))&0x3)
#define HEIGHT (6144)
#define BMP_OFFSET 0x436
#define BMP_SIZE ((WIDTH+WIDTH_ALIG)*HEIGHT+BMP_OFFSET)
unsigned char data[SIZE];
unsigned char image[BMP_SIZE];
FILE *src;
FILE *dest;
unsigned int *p_color;
unsigned char *p_data;
unsigned char *p_src;
BITMAPFILEHEADER *p_FileHeader;
BITMAPINFOHEADER *p_InfoHeader;
// unsigned char d0,d1;
unsigned char B2bin(unsigned char *x)
{
int t;
int i;
unsigned short r;
r = 0;
for ( i=0; i<2; i++ )
{
if ( *x <= '9' )
{
t = (*x-'0');
}
else
{
t = (*x-'A'+0xA);
}
r = (r<<4) + t;
x++;
}
return r;
}
unsigned short W2bin(unsigned char *x)
{
int t;
int i;
unsigned int r;
r = 0;
for ( i=0; i<4; i++ )
{
if ( *x <= '9' )
{
t = (*x-'0');
}
else
{
t = (*x-'A'+0xA);
}
r = (r<<4) + t;
x++;
}
return r;
}
void main(void)
{
int i,j,n;
char temp[80];
int byte_count;
unsigned short address;
int record_type;
int flag;
unsigned int img_address;
p_FileHeader = (BITMAPFILEHEADER*)&image[0];
p_InfoHeader = (BITMAPINFOHEADER*)&image[0xE];
p_color = (unsigned int *)&image[0x36];
p_data = &image[BMP_OFFSET];
p_FileHeader->bfType = 'B' | ('M'<<8);
p_FileHeader->bfSize = WIDTH*HEIGHT+BMP_OFFSET;
p_FileHeader->bfOffBits = BMP_OFFSET;
p_InfoHeader->biSize = 40;
p_InfoHeader->biWidth = WIDTH;
p_InfoHeader->biHeight = HEIGHT;
p_InfoHeader->biPlanes = 1;
p_InfoHeader->biBitCount = 8;
p_InfoHeader->biCompression = 0;
p_InfoHeader->biSizeImage = (WIDTH+WIDTH_ALIG)*HEIGHT;
p_InfoHeader->biXPelsPerMeter = 0;
p_InfoHeader->biYPelsPerMeter = 0;
p_InfoHeader->biClrUsed = 0;
p_InfoHeader->biClrImportant = 0;
for (i=0; i<0x100; i++)
{
p_color[i] = (i<<16) | (i<<8) | i; // set gray pattern
}
src = fopen("memory.hex", "rb");
fread(data,1,SIZE,src);
fclose(src);
p_src = &data[0];
temp[0] = 0;
flag = 1;
while ( flag )
{
sscanf(p_src,"%s",temp);
n = strlen(temp);
if ( n == 0 )
{
break;
}
// printf("%s\n",temp);
if (':' != temp[0]) continue;
byte_count = B2bin(&temp[1]);
address = W2bin(&temp[3]);
record_type= B2bin(&temp[7]);
switch ( record_type )
{
case 0: // data record
for( j=0; j<byte_count; j++ )
{
p_data[img_address+address+j] = B2bin(&temp[9+j*2]);
}
break;
case 1: // end
flag = 0;
break;
case 4: // relocate
img_address = ((W2bin(&temp[9]) & 0xfff)<<16);
break;
default:
break;
}
// reset var.
p_src += (n+2);
temp[0] = 0;
}
dest = fopen("CIS.bmp", "wb");
fwrite(image, 1, BMP_SIZE, dest);
fclose(dest);
}
2013年11月13日 星期三
HEX轉成文字檔
J-Link取得資料,在PC上存成HEX格式。
寫了小程式轉成資料,可以用於Excel上看。
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <windows.h>
#define SIZE (0x1000000)
#define MEM_SIZE (0x10000)
unsigned char data[SIZE];
unsigned char image[MEM_SIZE];
FILE *src;
FILE *dest;
unsigned char *p_data;
unsigned char *p_src;
unsigned char B2bin(unsigned char *x)
{
int t;
int i;
unsigned short r;
r = 0;
for ( i=0; i<2; i++ )
{
if ( *x <= '9' )
{
t = (*x-'0');
}
else
{
t = (*x-'A'+0xA);
}
r = (r<<4) + t;
x++;
}
return r;
}
unsigned short W2bin(unsigned char *x)
{
int t;
int i;
unsigned int r;
r = 0;
for ( i=0; i<4; i++ )
{
if ( *x <= '9' )
{
t = (*x-'0');
}
else
{
t = (*x-'A'+0xA);
}
r = (r<<4) + t;
x++;
}
return r;
}
void main(void)
{
int i,j,n;
char temp[80];
int byte_count;
unsigned short address;
int record_type;
int flag;
unsigned int img_address;
int first_address_flag = 0;
unsigned int first_address;
unsigned short *w_data;
p_data = &image[0];
src = fopen("memory.hex", "rb");
fread(data,1,SIZE,src);
fclose(src);
p_src = &data[0];
temp[0] = 0;
flag = 1;
while ( flag )
{
sscanf(p_src,"%s",temp);
n = strlen(temp);
if ( n == 0 )
{
break;
}
// printf("%s\n",temp);
if (':' != temp[0]) continue;
byte_count = B2bin(&temp[1]);
address = W2bin(&temp[3]);
record_type= B2bin(&temp[7]);
switch ( record_type )
{
case 0: // data record
if(! first_address_flag )
{
first_address = img_address + address;
first_address_flag = 1;
}
for( j=0; j<byte_count; j++ )
{
p_data[img_address+address+j-first_address] = B2bin(&temp[9+j*2]);
}
break;
case 1: // end
flag = 0;
break;
case 4: // relocate
img_address = ((W2bin(&temp[9]))<<16);
break;
default:
break;
}
// reset var.
p_src += (n+2);
temp[0] = 0;
}
dest = fopen("audio.csv", "w");
w_data = (unsigned short *) &image[0];
for( i=0; i<MEM_SIZE/2; i++)
{
if(*w_data == 0 ) break;
fprintf(dest,"%d\n",*w_data);
w_data++;
}
// fwrite(image, 1, MEM_SIZE, dest);
fclose(dest);
}
寫了小程式轉成資料,可以用於Excel上看。
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <windows.h>
#define SIZE (0x1000000)
#define MEM_SIZE (0x10000)
unsigned char data[SIZE];
unsigned char image[MEM_SIZE];
FILE *src;
FILE *dest;
unsigned char *p_data;
unsigned char *p_src;
unsigned char B2bin(unsigned char *x)
{
int t;
int i;
unsigned short r;
r = 0;
for ( i=0; i<2; i++ )
{
if ( *x <= '9' )
{
t = (*x-'0');
}
else
{
t = (*x-'A'+0xA);
}
r = (r<<4) + t;
x++;
}
return r;
}
unsigned short W2bin(unsigned char *x)
{
int t;
int i;
unsigned int r;
r = 0;
for ( i=0; i<4; i++ )
{
if ( *x <= '9' )
{
t = (*x-'0');
}
else
{
t = (*x-'A'+0xA);
}
r = (r<<4) + t;
x++;
}
return r;
}
void main(void)
{
int i,j,n;
char temp[80];
int byte_count;
unsigned short address;
int record_type;
int flag;
unsigned int img_address;
int first_address_flag = 0;
unsigned int first_address;
unsigned short *w_data;
p_data = &image[0];
src = fopen("memory.hex", "rb");
fread(data,1,SIZE,src);
fclose(src);
p_src = &data[0];
temp[0] = 0;
flag = 1;
while ( flag )
{
sscanf(p_src,"%s",temp);
n = strlen(temp);
if ( n == 0 )
{
break;
}
// printf("%s\n",temp);
if (':' != temp[0]) continue;
byte_count = B2bin(&temp[1]);
address = W2bin(&temp[3]);
record_type= B2bin(&temp[7]);
switch ( record_type )
{
case 0: // data record
if(! first_address_flag )
{
first_address = img_address + address;
first_address_flag = 1;
}
for( j=0; j<byte_count; j++ )
{
p_data[img_address+address+j-first_address] = B2bin(&temp[9+j*2]);
}
break;
case 1: // end
flag = 0;
break;
case 4: // relocate
img_address = ((W2bin(&temp[9]))<<16);
break;
default:
break;
}
// reset var.
p_src += (n+2);
temp[0] = 0;
}
dest = fopen("audio.csv", "w");
w_data = (unsigned short *) &image[0];
for( i=0; i<MEM_SIZE/2; i++)
{
if(*w_data == 0 ) break;
fprintf(dest,"%d\n",*w_data);
w_data++;
}
// fwrite(image, 1, MEM_SIZE, dest);
fclose(dest);
}
2013年11月6日 星期三
Cortex M系列開始進入Tick-Tock時代
Intel的Tick-Tock策略是成就CPU帝國的重要推手。
沒想到Cortex-M也開始進入這樣的時代。
在今年(2013)年Cortex-M4進入火熱競爭的狀況下,在推展上很快進入價格戰。
也就是功能性推展(Tick)戰正在進行中。但Cost Down(Tock)也已經展開。
可是面對硬體價格低,功能卻不斷增加,但應用推展卻是緩慢的狀況下。
各廠商開始意識到,客戶是無法一口氣能夠控制複雜功能MCU。
韌體開始元件化,而硬體設定簡單化成為目前推展上的重點。
整合開發工具的方便性將會拉開Cortex-M系列和其他MCU開發上的差距。
也就是使用Cortex-M系列的工程師在圖型化界面拉一拉,就可以設定好MCU的工作模式。
反觀傳統MCU還在工程師一行行寫程式的狀況下,產能會逐漸拉開。
MCU功能多樣化,韌體元件化,程式資源的豐富性,PC資源連接。等等加速拉開Cortex M和傳統MCU之間的距離。
價格成為最後的底線,只要Cortex-M壓到多低,傳統MCU就只能更低。
而學MCU不是一二年可以成的,若是學傳統MCU只能在NT10元以下的MCU市場寫程式,可想而知薪水也高不起來。
Tick-Tock的出現,時代轉變。MCU的下一步?
還在觀察!
沒想到Cortex-M也開始進入這樣的時代。
在今年(2013)年Cortex-M4進入火熱競爭的狀況下,在推展上很快進入價格戰。
也就是功能性推展(Tick)戰正在進行中。但Cost Down(Tock)也已經展開。
可是面對硬體價格低,功能卻不斷增加,但應用推展卻是緩慢的狀況下。
各廠商開始意識到,客戶是無法一口氣能夠控制複雜功能MCU。
韌體開始元件化,而硬體設定簡單化成為目前推展上的重點。
整合開發工具的方便性將會拉開Cortex-M系列和其他MCU開發上的差距。
也就是使用Cortex-M系列的工程師在圖型化界面拉一拉,就可以設定好MCU的工作模式。
反觀傳統MCU還在工程師一行行寫程式的狀況下,產能會逐漸拉開。
MCU功能多樣化,韌體元件化,程式資源的豐富性,PC資源連接。等等加速拉開Cortex M和傳統MCU之間的距離。
價格成為最後的底線,只要Cortex-M壓到多低,傳統MCU就只能更低。
而學MCU不是一二年可以成的,若是學傳統MCU只能在NT10元以下的MCU市場寫程式,可想而知薪水也高不起來。
Tick-Tock的出現,時代轉變。MCU的下一步?
還在觀察!
訂閱:
文章 (Atom)