99精品久久久久久久免费看蜜月/欧美激情做真爱牲交视频/日本不卡不码高清免费观看/三浦惠理子jux240久久 - 他在车里撞了我八次主角是谁

購物車0種商品
IC郵購網-IC電子元件采購商城
深入淺出: C 與 C++ 中“結構直接復制”的探討
(2011/10/25 9:27:00)

結構直接復制在 c 語言中使用的不多, 但在 c++ 卻是一個熱門,幾乎每一本書,幾乎每一個 c++ 程序員的面試都不可避免的提到結構直接復制的問題。我們現在來探討結構直接復制在 c 與 c++ 有什么異同,先來看看一段簡單的程序:



    typedef struct SA
    {
    char x;
    } A;

    void main (void) {
    A a1, a2;
    a1 = a2;
    }
復制代碼


其中的 a1 = a2, 就是結構直接復制, 在 c 中,這種方法優劣如何呢?來看看Keil C 生成的匯編代碼:



    14: a1 = a2;
    C:0x0D07 7808 MOV R0,#0x08
    C:0x0D09 7C00 MOV R4,#0x00
    C:0x0D0B 7D00 MOV R5,#0x00
    C:0x0D0D 7B00 MOV R3,#0x00
    C:0x0D0F 7A00 MOV R2,#0x00
    C:0x0D11 7909 MOV R1,#0x09
    C:0x0D13 7E00 MOV R6,#0x00
    C:0x0D15 7F01 MOV R7,#0x01
    C:0x0D17 120C2C LCALL C?COPY(C:0C2C)
復制代碼
可以看到,僅僅一個字節的復制,竟然使用了大量的代碼,效率及其低下。而這段代碼與Keil C 中 memcpy 是一模一樣的:




    15: memcpy(&a1, &a2, sizeof(A));
    C:0x0CF3 7808 MOV R0,#0x08
    C:0x0CF5 7C00 MOV R4,#0x00
    C:0x0CF7 7D00 MOV R5,#0x00
    C:0x0CF9 7B00 MOV R3,#0x00
    C:0x0CFB 7A00 MOV R2,#0x00
    C:0x0CFD 7909 MOV R1,#0x09
    C:0x0CFF 7E00 MOV R6,#0x00
    C:0x0D01 7F01 MOV R7,#0x01
    C:0x0D03 120C2C LCALL C?COPY(C:0C2C)
復制代碼
這就是說,Keil C 中”結構直接復制” 簡單的調用了 memcpy。 而 8051 既沒有 DMA, 也沒有 block move/copy 之類的復制指令,因此 memcpy 的效率不會很高。


現在我們來看看 C++ 下面的表現,編譯器使用 Borland C++, 同樣的代碼,Borland c++ 顯然聰明了很多,僅僅生成了兩條 8086 匯編指令:
cs:026D 8A46FC mov al,[bp-04]
cs:0270 8846F8mov [bp-08],al

非常精簡。 這樣,沒有什么比較性。我們現在稍微修改一下
typedef struct SA
{

char x[3];
} A;

此時,Borland C++ 同樣生成了一大堆的代碼:




    #TEST2#13:a1 = a2;
    cs:026D 8D46FC lea ax,[bp-04]
    cs:0270 16 push ss
    cs:0271 50 push ax
    cs:0272 8D46F8 lea ax,[bp-08]
    cs:0275 16 push ss
    cs:0276 50 push ax
    cs:0277 B90300 mov cx,0003
    cs:027A E8D31E call N_SCOPY@
復制代碼



我們可以得出一個結論,borland c++
下”結構直接復制” 的效率也不過如此。





等等!結構(類)直接復制在 c++ 里大量的使用,難道沒有一個更好的方法來實現么?比如:



a1.x[0] = a2.x[0];



a1.x[1] = a2.x[1];



a1.x[2] = a2.x[2];



或者,程序員只想復制其中一部分的數據,而不是像在 c 下用memcpy 全部復制?C++ 下有什么樣的方法可以實現呢?




網友評論:回答劉工 9 樓的問題:

復制一個10,000字節的結構或者文件!
自己寫for還是while ?不用,a1=a2; 一分鐘不要,很簡單就完成了
不錯,a1 = a2 看上去是比 memcpy(&a1, &a2, 10000) 更簡單,但是別忘了 struct 需要聲明,先不必提動態文件緩沖區,來看看不同的文件復制:
memcpy(&p1, &p2, 10001);
memcpy(&p3, &p4, 10002);

劉工你打算聲明多少個結構?

網友評論:向24樓的母親致意!cao 劉前輩(冷漠)的全家!

既然劉前輩(冷漠)如此的不要臉,那么我也不會劉前輩(冷漠)講什么風度。我會讓我的小弟們專程上來問候劉前輩(冷漠)的母親。

網友評論:自己不會,就去百度
1、星形網絡拓撲結構: 以一臺中心處理機(通信設備)為主而構成的網絡,其它入網機器僅與該中心處理機之間有直接的物理鏈路,中心處理機采用分時或輪詢的方法為入網機器服務,所有的數據必須經過中心處理機。 星形網的特點: (1)網絡結構簡單,便于管理(集中式); (2)每臺入網機均需物理線路與處理機互連,線路利用率低; (3)處理機負載重(需處理所有的服務),因為任何兩臺入網機之間交換信息,都必須通過中心處理機; (4)入網主機故障不影響整個網絡的正常工作,中心處理機的故障將導致網絡的癱瘓。 適用場合:局域網、廣域網。
2、總線形網絡拓撲結構: 所有入網設備共用一條物理傳輸線路,所有的數據發往同一條線路,并能夠由附接在線路上的所有設備感知。入網設備通過專用的分接頭接入線路。總線網拓撲是局域網的一種組成形式。 總線網的特點: (1)多臺機器共用一條傳輸信道,信道利用率較高; (2)同一時刻只能由兩臺計算機通信; (3)某個結點的故障不影響網絡的工作; (4)網絡的延伸距離有限,結點數有限。 適用場合:局域網,對實時性要求不高的環境。
3、環形網絡拓撲結構: 入網設備通過轉發器接入網絡,每個轉發器僅與兩個相鄰的轉發器有直接的物理線路。環形網的數據傳輸具有單向性,一個轉發器發出的數據只能被另一個轉發器接收并轉發。所有的轉發器及其物理線路構成了一個環狀的網絡系統。 環形網特點: (1)實時性較好(信息在網中傳輸的最大時間固定); (2)每個結點只與相鄰兩個結點有物理鏈路; (3)傳輸控制機制比較簡單; (4)某個結點的故障將導致物理癱瘓; (5)單個環網的結點數有限。 適用場合:局域網,實時性要求較高的環境。
4、網狀網絡拓撲結構: 利用專門負責數據通信和傳輸的結點機構成的網狀網絡,入網設備直接接入結點機進行通信。網狀網絡通常利用冗余的設備和線路來提高網絡的可靠性,因此,結點機可以根據當前的網絡信息流量有選擇地將數據發往不同的線路。 適用場合: 主要用于地域范圍大、入網主機多(機型多)的環境,常用于構造廣域網絡。

http://zhidao.baidu.com/question/80089729.html




網友評論:這兩人前世骨頭混一塊了,唉

網友評論:這是咋回事呢?

網友評論:這個劉前輩就是以前的wxj1952和冷漠。

本來是一個純技術貼,又被劉前輩wxj1952冷漠給攪了,雖然我已經很克制了。查看 劉前輩wxj1952冷漠 的歷史,它們基本上最后都是用上各種下流的手段。不知道所長是不是挖了劉前輩wxj1952冷漠祖墳,以至于對所長這么大的仇恨。

看過所長的帖子,所長雖然孤傲,但是人品技術絕佳,這點相信大家有目共睹。我維護所長,并非我認識所長,只是敬佩而已,正如我曾維護 hotpower 一樣。我不怕跌份,不會像所長那樣放不下君子身價與小人纏斗,只能退走,任由小人肆意中傷。

所長的離去,真是可惜,還有 iceage, 算法方面比highgear 還高,c++ 更是令 highgear望塵莫及,可惜他們都太君子了。

網友評論:

誰說keil C51結構拷貝不能優化?!LZ自己不會優化,就以為所有的人都不會比自己更高明?真以為自己天下第一呢。

呵呵,讓小輩我來教教你,LZ 睜大眼睛看清楚,俺是怎么實現優化的。把LZ的memcpy( )從282字節優化到了22字節。




一下子顯得LZ這種探討沒了一點意義,純粹是自己無知,什么“一字節復制使用了大量代碼,效率極其低下。”還玩到了C++來解決keil C51效率低下的問題?
本想貶低他人,結果還是讓keil 羞辱了一把。你當keil 這個老外德國人像你這么蠢?
1#
可以看到,僅僅一個字節的復制,竟然使用了大量的代碼,效率及其低下.
這就是說,Keil C 中”結構直接復制” 簡單的調用了 memcpy。
真像那么回事似地。我KEIL C調用了所長的memcpy( ) ? 誰調用誰呀,裝腔作勢似地。 你的memcpy( ) 能像結構復制這樣優化? 你玩一個給俺瞧瞧,開開眼。別光顧著指責別人這不行,那不對;很簡單的道理,你玩一個對的、漂亮的給我們菜鳥看看,做個模板讓我們學習。別光憑嘴巴說,玩文化產業,忽悠我們菜鳥不懂 ?

唬得了一時騙不了長久 。騙到54 歲了還大忽悠呢。
13樓早就告訴你,結構拷貝可以寄存器優化,而memcpy()無法實現(用戶實參指針,你能優化?好好動動腦子)。竟然沒聽懂別人說的是什么。

呵呵,所長“天下第一高手”這幾天又要在家研究memcpy 的優化問題了。一定要和別人比較個高下?
累不累?


、、

、、

網友評論:別,這個是地址復制吧。

網友評論:小朋友真會開玩笑,拿魔術這一套來糊弄人



說白了就是自己寫個類似頭文件的東東拿來騙人的

網友評論:我承認我比較菜,我把Keil能更改的設置全改一遍,仍然得不到劉xx圖示的結果,說人家PS的吧,無憑無據不能亂說。仔細看圖片代碼才發現問題的癥結所在
我們編譯器自帶的C?COPY是插在Main函數之前的,而且不會有LOOP1這種指定地址的方式的,他的C?COPY函數為什么會在Main函數之后,
再看那個項目怎么比我們自己做實驗多了個文件夾,結果就是那樣簡單,就像把劉謙的魔術放慢了仔細看,就知道他是怎么變出花樣來了。
這種把戲拿來娛樂一下大家,炫耀一下自己是不錯的
但拿來PK那就有點勝之不武了,不過對小孩子嘛,用不著上火動氣,自會有家長管教的

網友評論:

代碼開銷:和復制1字節一樣。282字節。當然時間可能不一樣,C51拷貝什么都是逐字節來的。反正C51上感覺不到,和復制1字節一樣快
-------------------------------
使用時鐘周期/字節.你就知道是不是一樣快了.
就是在c51上,優化還是有可能的.
-----------------------------------------------
不信你做一個32k字節的復制試試.
最快速的代碼是最長的代碼,最小的代碼是最慢的代碼
在高性能計算理論里,這叫做循環展開
------------------------------------------------
只會用for和while,卻不會選移動操作的人,還是一邊休息吧.
DMA快,但是是硬件層,這里不談

網友評論:

34樓aihe,我來教你怎么優化。你得不到結果,不一定是別人唬你。如若誰都能做到,LZ就不會在這做這種探討了。
首先282字節完全是由于?C?COPY這個通用的完整的庫函數代碼太長的緣故。它是通用的,無論是data——>XDATA,還是idata,xdata之間,都可以互相拷貝,沒什么不好。編譯器首先設好a1,a2,2個指針,和復制長度;然后調用?C?COPY函數。我想你當然知道,所長所說的“效率低下的大量代碼”是干什么用的:

1、a2 指針,在R1(指針低8),R2(指針高8),R3(存貯區編碼);
2、a1 指針,在R0,R4,R5;(對應上述 L,H, 編碼);
3、復制長度:int 在R6,R7。

效率低下?為了調用 ?C?COPY,8個寄存器一個也不能優化掉。因為?C?COPY是庫函數。它要求輸入3個實參。
所以,要縮寫代碼,只能重寫庫函數?C?COPY。
既然我是固定存貯區idata之間復制10字節,我只要把idata 之間互相復制的代碼加以利用就行了。其他的編譯器都做了。
我重寫了?C?COPY ,誰不知道項目庫函數連接順序可以自己設定?——把自己寫的?C?COPY函數放在當前項目文件目錄里就行了。
還用我把我寫的?C?COPY 函數源代碼給你看嗎?

冤枉了別人,是不是應該有所表示?

很多時候,不是我們比別人高明,只是我們想不到或者沒想到而已;別人一個套想了半年,我們可能想一輩子也想不到;所以,互相學習才好。
后面的結構復制 優化到22字節,更難想到了。所長弄出個什么一字節的結構復制!然后由此下結論:KeilC 不行,沒他的C++好。下這種套?還C++ 解決?結果把自己繞進去了。

、、、、

網友評論:

我沒冤枉你吧,是你重寫了?C?COPY函數,不是德國佬怎么高明,其他編譯器也可以這樣做的,也不是你特別能耐,也不能證明Keil在這點上比其他編譯器優越啊,
O(∩_∩)O哈哈~

網友評論:做硬件的不知道你們所云,呵呵淡定的飄過~

網友評論:

呵呵,aihe如若會重寫庫函數,早就想到了。那么也就不會有34樓的魔術疑問了。

還有,像那種“多了一個文件夾test”的問題,我看別人下面都是好幾個文件夾,——那些都是文本文件或者是其它項目文件,可以隨時換項目或者添加C文件的。


至于Keil C51 系統自帶的?C?COPY 和memcpy( )比較的問題,所長已經一開始就證明了,2者代碼完全一致,2者效率完全一樣,都同樣低下。自己把自己的memcpy( )否定了。面對事實,不得不。


aihe 還真有點特殊,你把memcpy( )實驗也用同一個編譯器做一下看,結果完全一樣。8個寄存器設置,然后調用?C?COPY庫函數。

如若懶得做,(怎么證明別人錯的時候那么大精神,各種設置值都實驗了一遍。)輪到證實自己錯誤的時候就懶得做了?咱們都是上海人,老鄉,不會互相開打吧。
我幫你做一遍?

、、

網友評論:我呢是比較菜,但是我相信Keil自帶的函數肯定是有他的道理,他們也不是白癡
開始我寫函數的時候,看別人的函數都是太復雜了,偷偷得精簡
不過到后來,考慮移植和通用,慢慢的寫的和人家的就差不多了
說錯話,做錯事不要緊,別人指正時只要虛心接受,有則改之無則加勉就可以了
我才沒事找人開打,不過那兒人都一樣,只要保持住自己的心境,淡定淡定,O(∩_∩)O哈哈~

網友評論:這下可以看清第二個文件夾 test 里的內容了。上面的內容主要是自己的隱私文件名,不愿公開而已。



網友評論:

既然你這么愿意幫忙,那就幫我把前幾個月寫的一段程序再優化優化,注芯片是STM8

void EE_Wrait(unsigned int pSrc, unsigned int pDst,unsigned char ucLength) //寫數據內置存儲器
{ //從源地址寫入到----目的地址----長度
unsigned char ucCount;
unsigned char *pDstAddr = (unsigned char *)pDst;
unsigned char *pSrcAddr = (unsigned char *)pSrc;
// 對數據EEPROM進行解鎖
do
{
FLASH_DUKR = 0xae; // 寫入第二個密鑰
FLASH_DUKR = 0x56; // 寫入第一個密鑰
}
while((FLASH_IAPSR & 0x08) == 0); // 若解鎖未成功,則重新再來

for(ucCount=0;ucCount<ucLength;ucCount++)
{
*pDstAddr = *pSrcAddr;
while((FLASH_IAPSR & 0x04) == 0); // 等待寫操作成功
pSrcAddr ++;
pDstAddr ++;
}
}

網友評論:劉工,這就對了,你若技術討論,那么就繼續技術討論;若繼續污言穢語惡意中傷,那highgear就奉陪,繼續問候你的家人。

劉工,優化 C?COPY 沒有意義,無論再如何優化,keil c 下 a1 = a2 的效率都是很低。一個簡單的一字節結構,仍然使用大量代碼,優化 c?copy 失去了意義。而且,我一直強調, keil c 沒有DMA 或 block Move 指令,因此,memcpy 的效率也不會比手工 c 代碼高。

不必糾纏在 C?COPY 的優化上,此舉對 a1 = a2 幫助不大。

網友評論:a1 = a2 在 keil c 下效率低下,而 Visual C++ 生成的代碼卻效率極高.

一字節結構:
a1 = a2;
004113B2mov al,byte ptr [a2]
004113B5mov byte ptr [a1],al

3 字節結構:

a1 = a2;
004113B2mov ax,word ptr [a2]
004113B6mov word ptr [a1],ax
004113BAmov cl,byte ptr [ebp-12h]
004113BDmov byte ptr [ebp-6],cl

8 字節結構:
a1 = a2;
004113BCmov eax,dword ptr [ebp-20h]
004113BFmov dword ptr [ebp-10h],eax
004113C2mov ecx,dword ptr [ebp-1Ch]
004113C5mov dword ptr [ebp-0Ch],ecx

12 字節結構:
a1 = a2;
004113BCmov eax,dword ptr [ebp-28h]
004113BFmov dword ptr [ebp-14h],eax
004113C2mov ecx,dword ptr [ebp-24h]
004113C5mov dword ptr [ebp-10h],ecx
004113C8mov edx,dword ptr [ebp-20h]
004113CBmov dword ptr [ebp-0Ch],edx

直至25字節以上,vc++ 才開始使用block move, 并未像 keil c 那樣調用 memcpy.
a1 = a2;
0041354Cmov ecx,6
00413551lea esi,[ebp-48h]
00413554lea edi,[ebp-24h]
00413557rep movs dword ptr es:[edi],dword ptr [esi]
00413559movs byte ptr es:[edi],byte ptr [esi]

通過比較,可以這么猜測:結構復制在 c 不常用的原因,導致 keil c 并未對其優化;而 vc++ 中則因為結構復制的大量使用(c++中,結構是all public 的類),則特別優化,手工生成的代碼也不過如此了。

網友評論:

如果對 c?copy 優化感興趣,可以看看 keil c 論壇的帖子(我前面摘抄的英文源自于此):

http://www.keil.com/forum/6950/
http://www.keil.com/forum/8701/

Custom ?C?COPY ?
Bill Webster
I would dearly love to replace some of the Keil library functions that are used by intrinsics, such as ?C?COPY, which is called by memcpy (and by other things). My current goal is to generate runtime errors on certain types of copies, but replacement would be useful for other purposes.

I've actually written my own implementation of ?C?COPY, which works fine. The inline instructions are still emitted by the compiler and my version is linked.

However, I'm concerned about compatibility with future compiler releases.

I'm supposing that the interface can't change, because this would break older libraries, which could be third party.

But other library functionality may depend on something internal to the Keil ?C?COPY implementation, or may do so in future.

For my current purposes, I'm thinking of patching the entry to the Keil ?C?COPY after the code is built, to call my checking routine. This only requires that the interface doesn't change.

Has anyone else tried anything like this? Any comments on my assumption that the interface can't change?

PS - I know I can acheive my ends by writing my own memcpy and redefining memcpy() with a macro, but then heaps more code will be generated, because the calls will be far less efficient, without the special parameter passing.

網友評論:43樓aihe 的幫忙工作有沒有效益?若是一般研究,我就交給學生做了。
小意思,可以到我家里來共同探討。我請你吃飯。
我住靜安。

網友評論:我等,程序盲,基本不會考慮效率問題,最直接的方法是升級處理器~~

網友評論:

2個相同算法之間相差幾十個字節長度,根本無所謂效率問題,又不是核反應堆。
而且多數情況下,code 長度大(實際開銷小)的那個算法更通用完善。

像LZ 指責keil C51 代碼效率低,又臭又長,純粹是無知。微軟的Windows 臭不臭,長不長?LZ 優化一個給蓋茨 看看?到微軟應聘去吧。在這混,太屈才了。



、、

網友評論:

43樓 aihe:

學生交卷了,換了一種算法,code 縮減了一半多。——功能完全一樣。
請你檢驗一下,有什么錯誤沒有。如果正確,是不是應該表示一下?錯了請指正。(我說他寫的不錯,如果證實,還得再次點名欣賞,可以就此強調一下概念。)

無論正/ 誤,都可以讓網友學習一下。

修改代碼如下:
void EE_Wrait(unsigned intpSrc,unsigned intpDst,unsigned charucLength)
{
unsigned char ucCount;
unsigned charidata * pDstAddr =&pDst;
unsigned charidata * pSrcAddr =&pSrc;

do
{
FLASH_DUKR = 0xae;
FLASH_DUKR = 0x56;
}

while((FLASH_IAPSR & 0x08) == 0);

for(ucCount=0; ucCount < ucLength; ucCount++)
{
pDstAddr [ucCount] = pSrcAddr [ucCount] ;

while((FLASH_IAPSR & 0x04) == 0);
//pSrcAddr ++;
//pDstAddr ++;
}
}
code= 52 ; // 還要優化么?

原code=139 ;


//

網友評論:43樓 aihe老師的程序已是最優化的了,贊一個~~~

aihe老師注明芯片是STM8,真搞不懂,LS的大師怎么把51的 idata 存儲器用于STM8? STM8芯片有 idata 存儲器嗎?

網友評論:學習了

網友評論:
43樓 aihe:

學生交卷了,換了一種算法,code 縮減了一半多。——功能完全一樣。
請你檢驗一下,有什么錯誤沒有。如果正確,是不是應該表示一下?錯了請指正。(我說他寫的不錯,如果證實,還得再次點名欣賞,可以就 ...
劉前輩 發表于 2011-5-13 11:32
void EE_Wrait(unsigned intpSrc,unsigned intpDst,unsigned charucLength)
{
unsigned char ucCount;
unsigned charidata * pDstAddr =&pDst;
unsigned charidata * pSrcAddr =&pSrc;


pDstAddr =&pDst根本就是錯誤的,怎么改的?

網友評論:LS小六子,大師哪會錯?

錯的肯定不是小三就是小六~~~

網友評論:把你的程序替代,編譯通不過

#error cpstm8 main.c:43(31+4) incompatible pointer types

我是這樣調用的
EE_Wrait((unsigned int)&Sys_Set[0].Tim2_F,(0x4000+(((unsigned int)&Sys_Set[0].Tim2_F)-(unsigned int)&Sys_Set[0])),sizeof(Sys_Set[0].Tim2_F));
或這樣
EE_Wrait((unsigned int)&Start_Set,0x4000,sizeof(Start_Set));

但是我發現我的代碼并不是很優化,比另外的寫法多占有空間,但是這樣寫很直觀

網友評論:
    IAR STM8 1.2 直接使用__eeprom關鍵字訪問EEPROM

    STM8L15X:
    #include "stm8l15x_conf.h"

    void __eeprom_write_8(unsigned short addr_eep,unsigned char data)
    {
    FLASH_WaitForLastOperation(FLASH_MemType_Data);
    FLASH_Unlock(FLASH_MemType_Data);

    FLASH_ProgramByte(addr_eep, data);

    FLASH_WaitForLastOperation(FLASH_MemType_Data);
    FLASH_Lock(FLASH_MemType_Data);
    }

    void __eeprom_write_16(unsigned short addr_eep,unsigned short data)
    {
    FLASH_WaitForLastOperation(FLASH_MemType_Data);
    FLASH_Unlock(FLASH_MemType_Data);

    FLASH_ProgramByte(addr_eep, data/256);
    FLASH_WaitForLastOperation(FLASH_MemType_Data);

    FLASH_ProgramByte(addr_eep+1, data%256);
    FLASH_WaitForLastOperation(FLASH_MemType_Data);

    FLASH_Lock(FLASH_MemType_Data);
    }

    void __eeprom_write_32(unsigned short addr_eep,unsigned long data)
    {
    FLASH_WaitForLastOperation(FLASH_MemType_Data);
    FLASH_Unlock(FLASH_MemType_Data);

    FLASH_ProgramByte(addr_eep, (unsigned char)(data>>24));
    FLASH_WaitForLastOperation(FLASH_MemType_Data);

    FLASH_ProgramByte(addr_eep+1, (unsigned char)(data>>16));
    FLASH_WaitForLastOperation(FLASH_MemType_Data);

    FLASH_ProgramByte(addr_eep+2, (unsigned char)(data>>8));
    FLASH_WaitForLastOperation(FLASH_MemType_Data);

    FLASH_ProgramByte(addr_eep+3, (unsigned char)(data>>0));
    FLASH_WaitForLastOperation(FLASH_MemType_Data);

    FLASH_Lock(FLASH_MemType_Data);
    }


    void __eeprom_write_many(unsigned short addr_eep,unsigned short size,unsigned short dummy,unsigned short addr_ram)
    {

    FLASH_WaitForLastOperation(FLASH_MemType_Data);
    FLASH_Unlock(FLASH_MemType_Data);

    for(unsigned short i=0;i<size;i++)
    {
    FLASH_ProgramByte(addr_eep+i, *((unsigned char *)(addr_ram)+i));
    FLASH_WaitForLastOperation(FLASH_MemType_Data);
    }


    FLASH_Lock(FLASH_MemType_Data);

    }



    STM8S:
    #include "stm8s_conf.h"

    void __eeprom_write_8(unsigned short addr_eep,unsigned char data)
    {
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
    FLASH_Unlock(FLASH_MEMTYPE_DATA);

    FLASH_ProgramByte(addr_eep, data);

    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
    FLASH_Lock(FLASH_MEMTYPE_DATA);
    }

    void __eeprom_write_16(unsigned short addr_eep,unsigned short data)
    {
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
    FLASH_Unlock(FLASH_MEMTYPE_DATA);

    FLASH_ProgramByte(addr_eep, data/256);
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

    FLASH_ProgramByte(addr_eep+1, data%256);
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

    FLASH_Lock(FLASH_MEMTYPE_DATA);
    }

    void __eeprom_write_32(unsigned short addr_eep,unsigned long data)
    {
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
    FLASH_Unlock(FLASH_MEMTYPE_DATA);

    FLASH_ProgramByte(addr_eep, (unsigned char)(data>>24));
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

    FLASH_ProgramByte(addr_eep+1, (unsigned char)(data>>16));
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

    FLASH_ProgramByte(addr_eep+2, (unsigned char)(data>>8));
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

    FLASH_ProgramByte(addr_eep+3, (unsigned char)(data>>0));
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

    FLASH_Lock(FLASH_MEMTYPE_DATA);
    }


    void __eeprom_write_many(unsigned short addr_eep,unsigned short size,unsigned short dummy,unsigned short addr_ram)
    {

    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
    FLASH_Unlock(FLASH_MEMTYPE_DATA);

    for(unsigned short i=0;i<size;i++)
    {
    FLASH_ProgramByte(addr_eep+i, *((unsigned char *)(addr_ram)+i));
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
    }

    FLASH_Lock(FLASH_MEMTYPE_DATA);
    }


    主程序測試:
    volatile __eeprom __no_init char eep_u8;
    volatile __eeprom __no_init short eep_u16;
    volatile __eeprom __no_init long eep_u32;

    void main( void )
    {
    eep_u8=123;
    eep_u16=12345;
    eep_u32=123456789;

    while(1);

    }
復制代碼

網友評論:

123jj先別太興奮,不加idata一樣。關鍵是躲過調用庫函數。學生不過是移植到C51寫的程序,連我也沒玩過STM8。

小心最后自己打了自己的臉,讓年輕學生弄個瞠目結舌不好看。尤其是女性。又是比他們年長20歲的女性。一個異型 MCU 你贏了他們二十幾歲的學生很光彩是吧。“你們不懂吧……我就……” 呵呵,他們懂的東西,你這輩子入不了門。連皮毛都不可能懂。所長硬撐著都不懂,別說你了。

你還是專心注意力關心把自己的小車站起來為好。別老把眼睛盯著別人,跟所長似的,什么事非要和別人比個高下才興奮?越比對手年齡越小了,現在和23歲的在校生對陣了?

學生說他再去看看STM8手冊,我說不用,我一樣給你優秀!研究生C語言你免考了。(你用不著把所有的MCU都去學會,你將來不是要打工的。你是做研究的,你以后的道路和別人不一樣。)

有些人,干了一輩子,都在為別人打工。她什么類型的MCU都會一點,市場刷新太快,結果一生疲于奔命。其實我看這些自以為是的中年工程師,一輩子連51都學不好。會STM8?有用么?月薪最多10T而已。二踢腳,一生就這么過去了。姐姐還有發展前途?
學生23歲,我看他比你43歲寫的程序強多了。

再告訴你和你尊重的所長,為什么51你們學一輩子也學不到頭,看下面附件,……什么都知道點皮毛,然后就以為都會了。以為keil C效率低下?德國佬不過如此,缺少見識,看看德國佬干了什么,你技術生命不可能再學新技術了吧,現在知道再開始學也晚了……,這一生大概也只能玩玩小車了。

我還欠你10分,給不出去。

論壇上我就尊重2個人:殷文躍,XXX_xxx,他們看的懂我貼的是什么。他們知道KeilC51的分量,從來不在這方面輕浮裝懂。知道自己一生該干什么。



、、

網友評論:談不上興奮不興奮,反正俺C語言不懂,那幾十條基本指令都寫不全。

無知者無畏,俺早就不搞技術啦,怎么寫程序?那是N年前的歷史啦,已基本上忘個精光~~~

關于小車,前后匠人、老T叔撐著,后有 不光寫程序小盆友跟著,哪里輪得上俺這個半吊子出手?

不過有一點劉小輩說對啦,俺的一生疲于奔命,養家糊口,買房養LP,還要供孩子留學。

一生就這么過去了。沒有發展前途,彼此彼此,劉小輩也差不多如此吧,有能耐的人從不會把精力花在二姨家灌水!!!

至于這一生也只能玩玩小車?這一點劉小輩也說對啦,俺小車也玩不轉,要依靠匠人、老T叔、highgear、不光寫程序等等,這些網友大力支持,沒有這些網友的大力支持,俺一天也玩不下去。。。。。。。因為對這小玩意兒提不起興趣。

聽說劉小輩幾年前就玩小車?何不拿出來曬一曬,讓俺們菜鳥開開眼見~~~

網友評論:

避開51data寫一個。學生的長輩是中醫專家,總是教育后輩,中醫界尤其反感什么事還沒做到的時候就吹,“包治百病”“手到病除”“攻克癌癥”……(“移植”到論壇就是別人寫程序還在調試階段,就以為是最終結果了;就開始貶低他人不懂。認為別人很差勁……這也太著急了吧,高興的太早了吧。……)中醫界總是“我不能保證……容我試試……”。什么事給自己留后路。免得最后下不來臺。——也寫給所長,別堅持了幾年 memcpy( ) ,實在下不來臺,又換C++ 了。C++最后也不行,他還有C# ,還有JAVA。別到后來說胡話了。

#include<absacc.h>


void EE_Wrait(unsignedint pSrc, unsignedint pDst,unsigned char ucLength)
{
do
{
FLASH_DUKR = 0xae;
FLASH_DUKR = 0x56;
}
while((FLASH_IAPSR & 0x08) == 0);

while(ucLength--)
{
DBYTE[pSrc] = DBYTE[pDst];
while((FLASH_IAPSR & 0x04) == 0);
pSrc++;
pDst++;
}
}
一樣,code=51字節.

什么?STM8 沒有absacc.h ?! ——學生自己做的。


、、

網友評論:淡定,淡定
技術以外的東西大家去同僚老鄉版面去侃
劉xx的程序我放到Keil中試過了,優化效果的確明顯
我先說我程序的缺點:
1、把++,改為——,改判零,會再少一個字節
2、開鎖用完后沒把鎖再鎖上,易招賊,(誤寫入)
劉xx你程序的問題在于:看我的函數名和注釋就知道這是一個用于寫EEROM的程序,無論哪個單片機EEROM都不能用IDATA存取,不符合題意。

網友評論:

感謝老鄉,59樓的程序改過了,可行?

把下面的DATA存儲區說明修改成EEROM 區就行了。
DBYTE[pSrc] = DBYTE[pDst];

要不我拿個STC的EEROM 程序幫你改?反正都是學生作業,學生做完了還可以寫論文;這種實戰程序,評委都不懂的,只好給論文優秀。

有點錯更好啊,BUG越多越好,查錯才增長能力呢。一帆風順學生論文還沒內容可寫。


//

網友評論:



實際效果出來了,你那個程序比我那個多用了20個CODE
因為我去掉了idata

在Keil下面如果去掉idata也會這樣效果。。。
你自己試一下就知道了
我再重申一下,這個是寫EEPROM的程序,沒辦法給你評優
你再想一下,如果數據長度是200,你你那個程序能正常運行嗎?

網友評論:俺在51樓已說過了,aihe老師的程序已是最優化的了,有截圖為證。

可惜,aihe老師不相信俺~~~
43樓 aihe老師的程序已是最優化的了,贊一個~~~

......

123jj 發表于 2011-5-13 12:11


網友評論:

62樓 aihe 朋友:沒關系,小事一樁,很多方法,變通;
我原來不懂STM8,還不如我學生呢。學生說他查了一晚上資料就入門了。

1、你把下面的指針定義前面加上 @near ,也就是:

@near unsigned char *pDstAddr = (unsigned char *)pDst;
@near unsigned char *pSrcAddr = (unsigned char *)pSrc;

其它(你的程序)都不變,試試看什么效果;如果有效,一定告知。我好通知學生。——我實在不愿安裝什么STM8開發環境。只能看看書了。這是把3字節指針化為2字節,編譯結果按照C編譯器規則,肯定簡化。——這與Keil C51 使用idata 原理一樣。

還有,書上都有的程序,我覺得還是參考書上的好;書上的標準程序是廠家提供的,時序上肯定測試多少遍了。咱們用戶只管調用,恐怕不能隨便化簡吧。即使自己的程序好不容易通過,心里也沒底。誰知道芯片時序是什么樣?——換個環境程序又不靈了,怎么辦?

下面是書上的程序,要寫200個字節更簡單了;利用成塊寫入功能,按照128字節一個單位塊來寫,——又快又簡單。廠家提供的現成程序,一天就完成了。
不用自己下那么大工夫研究。

下面是廠家提供的按字節寫EEROM操作標準程序。



需要成塊編寫程序請告知。有必要把電子書發給你。(我今天看了一上午就大概明白了。)
我覺得你應該也有。而且肯定參考過比我更詳細的資料。——不明白為什么要自己寫。我絕對寫不過廠家——除非我在廠家做測試。
不過添加 @near 是我自己認為的,keilC實驗出來的。

廠家程序寫的真是無可挑剔,沒有3字節指令定義的情況。——沒地方需要加@near 。




、、

網友評論:真是的還不清楚嗎?
@near和XDATA一樣的意思
idata只能用在RAM的最前256字節,超過這個數字出現的結果無法預料?!
再說一下,哪個MCU的EEROM在idata的取址范圍里?!

網友評論:

aihe你說得對,我的@near是加在你自己定義的指針pDstAddr前面的 ,僅僅是說明你這個指針是個指向xdata區域 數據的指針,它只需要2字節分配(如果不加,那編譯器默認指針3字節指針。)STM8編譯器把它分配在哪,是編譯器的事,與用戶無關,這2個指針指向EEROM地址 pDst ,或 pSrc。 和EEROM 讀寫的數值沒關系,它只是個地址值,例如4000H。——它指向4000H,* pDstAddr 從4000H取數值,和pDstAddr 分配放在哪(xdata / idata ) 沒有關系,這和所有C語言概念一樣。
也許應該像下面這樣:

unsigned char * @near pDstAddr = (unsigned char *)pDst ;

如果你希望分配在256字節RAM區內,應該用@tiny ,關鍵是@near 或者 @tiny 的位置。keil C很簡單,如果形如
xdataint* idataptr;

說明ptr指向 xdata 區的 int ,而ptr在data 區。顯然數據操作在Xdata區。 STM8我無法實驗,看書上意思一樣。

還有,我理解的沒什么偏差,我看過書上的標準程序,沒錯。

你需要發給你看看,我以為你有。所以沒貼。

@eeprom unsigned char * pDstAddr = (unsigned char *)pDst ;
unsigned char @near * pDstAddr = (unsigned char *)pDst ;

都可能對,但意義不一樣。

等一等,我明白了。主要EEROM是什么區的問題?好像書上講明了。
還有一點。請問aihe ,你的2個指針都指向EEROM? 那你的程序好像沒通過?A,B倆個指針都指向EEROM,*A=*B;能行?可能還是要通過中間緩存。我認為至少pSrc不能是EEROM區。

@eeprom unsigned char* pDstAddr = (unsigned char *)pDst;
@near unsigned char *pSrcAddr = (unsigned char *)pSrc;

第二個@near 在64Kflash下是默認的,不用寫也行。









、、

網友評論:*A=*B能行,但A[n]=B[n]就不一定行

你改的快,我在朋友家幫忙修東西,順便腐敗一下,沒時間,截圖都準備好了,只是沒貼出來
你再看看我第二次說的,怎么調用這個程序,你就明白,我有可能從RAM寫到EEROM,也有可能從FLASH寫到EEROM,有可能是整個結構體寫入,例如首次開機初始化,有可能只寫1、2個字節用來修改部分參數還有可能接受外部的一次性修改,但是我并不需要從EEROM到EEROM,這個沒必要

網友評論:

明白了。書上3種方式都有范例。明天貼給你,我覺得加入下面語句很重要。你沒加是有原因?
/* 設置編程時間,FIX =1:編程時間固定為標準編程時間tprog。*/
FLASH_CR1 &= (unsigned char)(~0x01);
FLASH_CR1 |= 0x01;
A[n]=B[n]; 是要修改前面形參才可以的。例如:DBYTE 初始指向4000H而不是0000H。

2個指針不是同時指向EEROM就好辦了。按書上來,和你寫的也差不多,書上是按照存儲區不同來區分EEROM的;例如寫入4000H一字節就至少要3ms 。優化不優化關系不大。能縮減50個字節,效率一樣。


、、

網友評論:編程時間在初始化中,不放在這里更好,你說呢?
還有無論@tiny放在哪里編譯都通不過的。

在Keil中用idata只能在局限范圍內使用,你試試看吧。

網友評論:

已經知道代碼開銷由指針引起,避免很容易:(EEROM段設置很簡單)

void EE_Wrait(unsigned int pSrc, unsigned int pDst,unsigned char ucLength) //寫數據內置存儲器
{ //從源地址寫入到----目的地址----長度
unsigned char ucCount;

// 對數據EEPROM進行解鎖
do
{
FLASH_DUKR = 0xae; // 寫入第二個密鑰
FLASH_DUKR = 0x56; // 寫入第一個密鑰
}
while((FLASH_IAPSR & 0x08) == 0); // 若解鎖未成功,則重新再來

for(ucCount=0;ucCount<ucLength;ucCount++)
{
*(unsigned char *)pDst = *(unsigned char *)pSrc;
while((FLASH_IAPSR & 0x04) == 0); // 等待寫操作成功
pSrc ++;
pDst ++;
}
}

code 縮減1/3 ?——需要修改細節?從這里并看不出pDst是EEROM 區還是flash, Xdata RAM區。無所謂的,只要是指向004000H的指針就行。這是仿馮諾依曼結構,大家共64K/128K地址,讀EEROM區和讀 SRAM(Xdata)區一樣指令?知道寫入不一樣就行了。


、、

然后討論如何調用這個函數。


、、

網友評論:#error cpstm8 main.c:21 bad character ?
#error cpstm8 main.c:21 bad character ?
#error cpstm8 main.c:21(5) missing expression
#error cpstm8 main.c:21 bad character ?
#error cpstm8 main.c:21 bad character ?
#error cpstm8 main.c:21 bad character ?
#error cpstm8 main.c:21 bad character ?
#error cpstm8 main.c:21 bad character ?
#error cpstm8 main.c:21 bad character ?
main.c:
The command: "cxstm8 +mods0 +debug -pxp -no -pp -l -i"c:\program files\cosmic\cxstm8_32k\hstm8" -i"C:\Program Files\COSMIC\CXSTM8_32K\Hstm8"-clDebug\ -coDebug\ main.c" has failed, the returned value is: 1
exit code=1.

test.elf - 11 error(s), 0 warning(s)
編譯還是不過
COSMIC編譯要求很嚴的

網友評論:

很簡單的調試:刪去無關項,看看到底哪錯:
void EE_Wrait(unsigned int pSrc, unsigned int pDst,unsigned char ucLength)
//寫數據內置存儲器
{ //從源地址寫入到----目的地址----長度
unsigned char ucCount;

for(ucCount=0;ucCount<ucLength;ucCount++)
{
*(unsigned char *)pDst = *(unsigned char *)pSrc;
pSrc ++;
pDst ++;
}
}

上面是內存拷貝程序,與EEROM無關。若錯就是上面寫錯了,很好查。

程序基本上是廠商提供的,如若錯,肯定是我們自己哪不對。查吧,懶得查就放棄自己做。采用標準的。


bad character ,是出現了編譯器不接受的字符,——是文字輸入錯誤。很好檢查。——不是程序語法錯。

編譯器標出哪行錯?告知。還可以學習、修改一下:

如若你原來寫的函數可以用,不如見好就收,你好不容易花時間調試出來的;我隨便改也不好。改的反而不能用了,不討好的事。
商家都提供了,看不出有什么問題。我不可能比商家寫的更簡單。

在我這怎么優化都是很簡單的事,各種簡約方法都很好玩。 要不我裝一個COSMIC C 試試?意義不大。

下面是商家提供的程序:

unsigned int eeprom_address; /* 定義eeprom_address 變量 */

//定義EEPROM字節寫 函數
void EEPROM_WRITE_BYTE ( unsigned int eeaddress, unsigned chareedata)
{
eeprom_address = eeaddress;

/* 設置編程時間,FIX =1:編程時間固定為標準編程時間tprog。*/
FLASH_CR1 &= (unsigned char)(~0x01);
FLASH_CR1 |= 0x01;

/* MASS密鑰,解除EEPROM的保護 */
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;

*((unsigned char*) eeprom_address) = eedata;
//EOP=1,EEPROM編程結束
while((FLASH_IAPSR & 0x04) != 0x00);
}


看上去明顯避開使用指針,很簡約。


、、


、、

網友評論:*(unsigned char *)pDst = *(unsigned char *)pSrc
這個報錯,呵呵
將地址轉換成指針變量時必須強制轉換
我覺得從整體考慮,優化函數的輸入參數才是正事
算了也不要你改了,下次哪個網友有更好的方法告訴我一下

網友評論:

有道理。確實不嚴格。pSrc/pDst 是常量地址,編譯器嚴格點就通不過了。

好辦,稍微改改就通過了。——先設一個uint 變量pSrcAdrr ,不是指針;就行了。看廠商標準程序也是這么干的。


優化函數參數為指針,確實方便;不過code 就上去了。所以廠商也沒那么干。——到底是要好的算法,還是要最小的Code 。可能STM8Flash 空間小,所以追求后一項。


、、

網友評論:別費那個勁了
就此打住吧

網友評論:void EE_Wrait(unsigned int pSrc, unsigned int pDst,unsigned char ucLength) //寫數據內置存儲器
{ //從源地址寫入到----目的地址----長度
unsigned char ucCount;
unsigned int pDstAddr = pDst;
unsigned int pSrcAddr = pSrc;
// 對數據EEPROM進行解鎖
do
{
FLASH_DUKR = 0xae; // 寫入第二個密鑰
FLASH_DUKR = 0x56; // 寫入第一個密鑰
}
while((FLASH_IAPSR & 0x08) == 0); // 若解鎖未成功,則重新再來

for(ucCount=0;ucCount<ucLength;ucCount++)
{
*(unsignedchar *)pDstAddr = *(unsignedchar *)pSrcAddr;
while((FLASH_IAPSR & 0x04) == 0); // 等待寫操作成功
pSrcAddr ++;
pDstAddr ++;
}
}

Keil C 通過。可能 pDstAddr ++; 會因硬件特殊報錯。


//

網友評論:編譯通過,截圖為證,到此為止





網友評論:

我說以下幾點,僅供討論:
1. struct在c++中與class一樣,是用來定義類的,它們之間的區別是: struct默認的成員屬性是public的,class默認的是private.

2. A a1 = a2調用的是copy constructor. 而a1 = a2 調用的是assignment operator 函數(以下簡稱二個函數)。當你定義自己的類時,如果自己定義了這些函數,那我們沒有爭議,當然是調用這些函數。

3. 當我們沒定義這二個函數時,編譯器并不一定為我們提供這二個函數。提不提供要看你的類的定義具不具有 bitwise copy的語義。如果具有bitwise copy的語義,則編譯器并不提供這二個函數,而是直接進行member-wise r 復制,而這種復制各種編譯器的實現并不相同。如果不具有bitwise copy的語義,則會我們提供默認的這兩二個函數。
4. 類具有以下四種特征時,則不具備bitwise 語義:
a. 當這個類有一個類成員,并且這個類成員顯示的定義了這二個函數之一。
b. 當這個類繼承的基類顯示的定義了這二個函數之一。
c. 當這個類有虛函數的時候
d. 當這個類的繼承鏈中存一個虛基類的時候。

以上四種情況存在時,則一個類的bitwise語義被破壞,這時編譯器會提供上面提到的二個函數。除些之外,都是按照member-wise 來復制的,這個復制的實現各個編譯器并不一定相同。

C++博大精深,學了十年,仍感覺是初學者。從來敢說自己會C++.也可能是用的少的原因

網友評論:“從來敢說”應是“從未敢說”,

網友評論:
編譯通過,截圖為證,到此為止

aihe 發表于 2011-5-15 19:26
aihe老師說的對,就此打住,再費那個勁,也不會有結果的,因為編譯原理明擺著,優化是不可能超越基本硬件特征的。就算更改庫函數,強制用匯編優化,也省不了幾個字節,并且程序可移植性變差~~~

網友評論:

76樓學生寫的太精彩了,包含了很多概念應用。最終結果并不在于一個小小的改動就把code縮減幾十字節,主要是這里包含的教育意義。——什么叫直接尋址,間接尋址。能使用直接尋址的地方一定比使用間接尋址快。

aihe的源程序在keil C上 一個Xdata/idata就使程序代碼縮減近100字節!這就是直接尋址和指針間接尋址的差別。——和keil C 還是 COSMIC C 根本沒關系!

這年頭,誰比誰差?Keil C 有Xdata/ideta ,COSMIC C 相應尋址就有@near / @tiny 。
C 編譯器都是以ANSI C為標準的。論功能誰都不差。昨天是誰還在把 Keil C 貶的一無是處,現在是不是又該貶COSMICC 了。(在這種人眼里,除了自己,別人都是一無是處。—— 一天到晚以貶低別人為快樂。)以為意法 做不出個好的編譯器?貶低意法也快樂 ?

誰說76樓學生修改的程序可移植性差?123jj 是想說:“意法的程序寫的太差了,沒有可移植性。”?
見圖:



呵,別忘了學生這個仿COSMIC 源程序首先是在 keilC下通過的,什么意義不用提醒吧。—— ANSIC標準程序,這里沒有idata , Xdata,不用那么仔細找茬。(不會揪住第一條說事吧,那我把它刪了好了。)

貶低意法很快樂 ?

為何keilC加了一個xdata / idata 說明,就輕易把code 縮減了近 100字節?——COSMIC C理論上也一樣;修改前后編譯結果匯編碼的分析比較是真正快樂的事;分析過程中所發現的東西,學了十年都不知道。

所以可以這么說,aihe 無意中的這段程序極有價值。幾天學到的東西,勝讀十年書。——照本宣科講理論有什么意思,講講這段程序所包含的概念有意思多了。
像那種根本不會關注這種價值的分析研究過程的人,只關心什么“ keil 不算,這是STM8……”,呵,俺已經不關心這類處處給自己找臺階的事了,——僅從 keilC51 中發現的這種現象,才真正是讓學生關注、興趣投入的地方。
唉,贊嘆:由此知道為什么 年長并沒有用了。—— 有提升自己的好機會發現不了,——時間和生命全耗在 “頭忙著打仗呢。”“正忙于尋找PK目標呢。”


、、








網友評論:LS劉小輩正解!

直接尋址一定比使用間接尋址快!

在少量數據移動時,直接尋址指令短一點,速度快一點,比間接尋址有著天然的優勢!

但是,在大量數據移動時,直接尋址在速度上是能快一點,但代碼庸腫,比間接尋址增加N倍代碼!
并且幾乎難以做到同類型數據之間的代碼復制和移植!


這個問題根本不用討論C語言還是C++,你只要用匯編編寫一個移動復制1000個BYTE數據的代碼,不充許用間接尋址,只能用直接尋址,那個代碼量好嚇人啊~~~

網友評論:在代碼的壓縮問題上,俺一向只看匯編,如果C編譯后的代碼,同俺手工寫的差不多大小,俺就認為沒有再優化的必要了~~~

網友評論:俺也累了,劉小輩,咱們聽aihe老師之言
別費那個勁了
就此打住吧
aihe 發表于 2011-5-15 19:02


網友評論:淡定、淡定
在COSMIC上你那個程序和我那個最終的匯編代碼是一樣的
不知道intel做51時怎么想的,弄那么多的尋址方式,直接尋址就得了,還是Keil不夠智能化,呵呵
轉成指針時非得用三字節,還不存在Rx中,指針加1程序也搞得異常復雜
怪不得PIC等成為后起之秀呢
提醒一下自己,下次用這個程序時要小心了,如果FLASH+RAM+EEPROM超過64K時unsigned int是不夠用的

網友評論:修正一下,超過32K,因為STM207 FLASH的起始地址是8080

瀏覽:(5619)| 評論( 0 )
博文評論

  • 昵 稱:
  • 內 容:10~250個字符
  • 驗證碼: 驗證碼看不清楚?請點擊刷新驗證碼
  •                      
  • 博文分類

    熱點博文

    最新博文

    最新評論

    IC電子元件查詢
    IC郵購網電子元件品質保障