取得3.90版本,發現有Simulation。在VS2010下卻編不出來。
有幾個問題:
1. FiveChess.c找不到iostream.h
解法: 直接註解掉
因為這是C的寫法,VC6可以,但VS2010不行要改用namespace。不過沒有用到,所以直接註解掉。
2. Linker找不到LIBC.lib
解法: 修改propreites設定
Linker->Input->Ignore Specific Default Library
將內容libcmt.lib改為LIBC.lib
3. Debugger找不到執行檔
解法: 修改propreites設定
Linker->General->Output File
將內容Simulation.exe改為SimulationShip.exe
執行可以見到畫面了。
2014年1月16日 星期四
2013年12月23日 星期一
MCU可裁切式IO才是主流
並不是使用ST系列的MCU習慣了,而是每次想換總是差了一點功能。
各家CM4F其基本結構差不多,常用週邊也是差不多。
但是ST系列有些特性是比別家的好,自然就用得多。
1. Pin腳高度相容
使得在設計上,可以做Cost Down及Function Up方便得多。
2. 豐富週邊
許多內建週邊,就算不用,pin腳也可用做其他用途。
內建未用週邊,在未來性上,使工程師安心,也會使工程師開始想如何來利用。
3. 平衡性
許多公司都有做到可外接SDRAM等功能。但整體配合性以ST較為平衡。
這可能和週邊豐富性是正相關,在使用及調度上方便許多。
但豐富也可能引入其他副效應,就商業行為而言,先吸引使用者才是第一重點。
各家CM4F其基本結構差不多,常用週邊也是差不多。
但是ST系列有些特性是比別家的好,自然就用得多。
1. Pin腳高度相容
使得在設計上,可以做Cost Down及Function Up方便得多。
2. 豐富週邊
許多內建週邊,就算不用,pin腳也可用做其他用途。
內建未用週邊,在未來性上,使工程師安心,也會使工程師開始想如何來利用。
3. 平衡性
許多公司都有做到可外接SDRAM等功能。但整體配合性以ST較為平衡。
這可能和週邊豐富性是正相關,在使用及調度上方便許多。
但豐富也可能引入其他副效應,就商業行為而言,先吸引使用者才是第一重點。
2013年11月13日 星期三
HEX轉成BMP檔
也是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);
}
#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);
}
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的下一步?
還在觀察!
2013年10月6日 星期日
2013年10月3日 星期四
32位元MCU軟體的改變
8位元MCU最大的問題在ADC/DAC超過8位元後,取值及計算效能會下降。因為每筆資料皆需多次ALU計算。
16位元MCU則無此問題。它的問題是遇到32位元MCU。
8位元MCU多半沒有IP付費,應是說沒有利潤去買,不如自己做。
理論上16位元也是如此,但16位元自認為價格應高於8位元,價格不願低。
然後,32位元MCU突然在三年內劇降,直接壓縮了市場,價格直逼8位元。
16位元變成沒有空間。比價格比省電,不如8位元,比效能不如32位元。
再來是32位元不僅是核心快,週邊多到爆。幾乎和PDA接近。
更恐怖的是軟體,不用修改下,以前DOS程式近乎直接移。
這種軟體方便性不是8位元/16位元可以做到的。
和PC程式及資料相通,程式開發快且功能多。
32位元MCU對MCU是一場革命。
是一場軟體工程師對嵌入式系統主導設計的使用習慣變革。
大部分硬體信號可以由MCU內部軟硬體結構出來。
ADC/DAC精密度提高,使得濾波器可以使用軟體來做。
Flash容量一下子到1MB以上,多到可以做磁碟機來用。
一但檔案系統出現,連資料庫都可以放進去。
8/16位元要做,程式有得大改。
且大部分PC上的軟體多以作業系統下做主。
移到8/16位元會是大工程。
而32位元因有RTOS,所以問題小很多。
RTOS也有8/16位元,但因效能及RAM空間不足,安裝後不會有好表現。
MCU市場因使用慣性,不會馬上變化。
不過一但原先16位元可以用的應用,32位元會以優勢周邊攻入。
可能會有巨大資料儲存器,無線通信功能等等。
所以說像是PDA。
也可以說MCU正在PDA化,且價格不變。
MCU工程師也要進化為PDA工程師,不然就會變成傳統工程師,不再有價值。
這波革命是新的,軟體工程師正在工業化,變成勞工。若不升級,難保工程師之名。
訂閱:
文章 (Atom)