欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 小容量的單片機(jī)芯片怎么提高存儲(chǔ)空間利用率? [打印本頁(yè)]

作者: sadv    時(shí)間: 2021-9-22 11:12
標(biāo)題: 小容量的單片機(jī)芯片怎么提高存儲(chǔ)空間利用率?
如題,最近接觸到一款存儲(chǔ)空間非常小的單片機(jī),代碼量稍微大一點(diǎn)就用不了了,所以想問問大伙有沒有提高存儲(chǔ)空間利用率的辦法

作者: hhdsdy    時(shí)間: 2021-9-22 12:02
用匯編吧
作者: devcang    時(shí)間: 2021-9-22 12:12
精簡(jiǎn)代碼。。。
作者: npn    時(shí)間: 2021-9-22 12:19
具體是多少位,什么型號(hào)?
作者: lkc8210    時(shí)間: 2021-9-22 12:39
把代碼貼上來看看
作者: guizaishi    時(shí)間: 2021-9-22 13:17
減少不必要的程序,特別是數(shù)組,能少定義就少定義,能不定義全局變量就不要全局。.h文件也不要隨便定義,如果只用到printf而調(diào)用了 <stdio.h>,就不要用了
作者: zuiqf1978    時(shí)間: 2021-9-22 13:26
加24系列芯片,想加多大就多大!
作者: fj51hei    時(shí)間: 2021-9-22 13:37
guizaishi 發(fā)表于 2021-9-22 13:17
減少不必要的程序,特別是數(shù)組,能少定義就少定義,能不定義全局變量就不要全局。.h文件也不要隨便定義,如 ...

實(shí)際局部變量也不見得小,要知道局部變量有生存周期,如果生存周期長(zhǎng)了,沒有及時(shí)銷掉,跟全局有啥區(qū)別,甚至還不如全局
作者: 鄭漢松    時(shí)間: 2021-9-22 13:48
經(jīng)典的時(shí)間換空間的方法
作者: sadv    時(shí)間: 2021-9-22 13:53
感謝各位的回復(fù),芯片是SQ013L,目前的代碼里面已經(jīng)非常精簡(jiǎn)了,所有的全局變量都是按位來定義的,使用了位域來定義全局變量,比較坑爹的就是,貌似官方的這個(gè)開發(fā)環(huán)境下臨時(shí)變量使用完之后空間不會(huì)釋放掉,還是會(huì)占用資源
作者: sadv    時(shí)間: 2021-9-22 13:53
npn 發(fā)表于 2021-9-22 12:19
具體是多少位,什么型號(hào)?

SQ013L
作者: yzwzfyz    時(shí)間: 2021-9-22 15:39
只有當(dāng)你懂得匯編和單片機(jī)原理時(shí),才能準(zhǔn)確地精減并節(jié)省出空間。
當(dāng)你懂匯編后,才會(huì)知道C語(yǔ)言在何情況下浪費(fèi)、節(jié)省空間,如此你當(dāng)然就知道如何做了。
作者: 188610329    時(shí)間: 2021-9-22 15:42
sadv 發(fā)表于 2021-9-22 13:53
感謝各位的回復(fù),芯片是SQ013L,目前的代碼里面已經(jīng)非常精簡(jiǎn)了,所有的全局變量都是按位來定義的,使用了位 ...

只要是用C編寫的,永遠(yuǎn)沒資格說“非!本(jiǎn),全局變量,和和多所謂的局部變量,對(duì)程序大小是沒有直接關(guān)聯(lián)的,有關(guān)聯(lián)的是放入 R0~R7 的變量,還是放入內(nèi)存地址的變量,尤其是牽涉到計(jì)算,會(huì)對(duì)程序大小影響很大。然后避免只用一兩次的子函數(shù),直接囊括到主程序,也會(huì)有效的減小代碼,調(diào)用一次子函數(shù),就要有大量的 MOV R7,xxxx  以及返回后的 MOV xxxx, R7  這都是平白浪費(fèi)空間的操作,以及可重入函數(shù),不管有沒有涉及到重入的操作,都會(huì)有很多的 PUSH 和 POP 代碼。其實(shí)程序要縮小個(gè)20%左右,改匯編完全就能塞得下。
作者: Y_G_G    時(shí)間: 2021-9-22 15:58
這玩意是仿(義隆(仿PIC匯編))指令的OTP單片機(jī),也不知道是誰(shuí)仿誰(shuí),反正是跟著PIC走的
內(nèi)存只有1K,而且,是運(yùn)行精簡(jiǎn)指令的,沒有乘除法指令
所以,用C語(yǔ)言寫的話:盡量不要用浮點(diǎn)型數(shù)據(jù),盡量少用乘除法之類的高級(jí)運(yùn)算
當(dāng)然,最有效的辦法就是用匯編來寫,一般這種低端國(guó)產(chǎn)OTP單片機(jī),有些公司會(huì)要求指定用匯編來寫的
作者: wfqxgw    時(shí)間: 2021-9-22 16:00
如果是用Keil的話。里面有一個(gè)代碼優(yōu)化級(jí)別的。你選最大。有時(shí)會(huì)省20%左右空間。但是會(huì)讓你程序慢一些。這個(gè)看你自己決定
作者: sadv    時(shí)間: 2021-9-22 16:00
188610329 發(fā)表于 2021-9-22 15:42
只要是用C編寫的,永遠(yuǎn)沒資格說“非常”精簡(jiǎn),全局變量,和和多所謂的局部變量,對(duì)程序大小是沒有直接關(guān) ...

不懂匯編,不過感覺你說的很有道理,對(duì)于您說的調(diào)用次數(shù)很少的子函數(shù)浪費(fèi)空間的問題我也有做優(yōu)化,目前卡在一行進(jìn)行了多次移位和邏輯處理的語(yǔ)句上,加上這行語(yǔ)句程序大小增大很多就超出容量,單片機(jī)的RAM和ROM空間都很小,優(yōu)化了好一段時(shí)間也塞不進(jìn)去。
作者: 188610329    時(shí)間: 2021-9-22 16:03
sadv 發(fā)表于 2021-9-22 16:00
不懂匯編,不過感覺你說的很有道理,對(duì)于您說的調(diào)用次數(shù)很少的子函數(shù)浪費(fèi)空間的問題我也有做優(yōu)化, ...

有些精度不高的中間量,比如本來 0-500, 縮小到 0-250,用1個(gè)字節(jié),也是精簡(jiǎn)的一個(gè)方案,你可以參考一下。
作者: sadv    時(shí)間: 2021-9-22 16:06
Y_G_G 發(fā)表于 2021-9-22 15:58
這玩意是仿(義隆(仿PIC匯編))指令的OTP單片機(jī),也不知道是誰(shuí)仿誰(shuí),反正是跟著PIC走的
內(nèi)存只有1K,而且,是運(yùn) ...

確實(shí)是想替代義隆的單片機(jī)才找到的SQ013L,運(yùn)算方面沒有用到浮點(diǎn)類型的數(shù)據(jù),基本都是加減法和邏輯與或非的運(yùn)算。這個(gè)代碼只是一個(gè)demo,還有其他同事會(huì)在這個(gè)版本的基礎(chǔ)上修改滿足不同客戶的需求,匯編的話大家都不會(huì),改用匯編寫就會(huì)比較麻煩。
作者: sadv    時(shí)間: 2021-9-22 16:08
wfqxgw 發(fā)表于 2021-9-22 16:00
如果是用Keil的話。里面有一個(gè)代碼優(yōu)化級(jí)別的。你選最大。有時(shí)會(huì)省20%左右空間。但是會(huì)讓你程序慢一些。這 ...

是用的官方的開發(fā)環(huán)境,沒有KEIL那么強(qiáng)大,而且優(yōu)化效率不高,只能自己在代碼上想辦法
作者: sadv    時(shí)間: 2021-9-22 16:10
188610329 發(fā)表于 2021-9-22 16:03
有些精度不高的中間量,比如本來 0-500, 縮小到 0-250,用1個(gè)字節(jié),也是精簡(jiǎn)的一個(gè)方案,你可以參考一下 ...

感謝,已經(jīng)做過嘗試,所有變量都是按位來定義的,也沒有用到這么大的數(shù)據(jù),8位就夠用了
作者: sadv    時(shí)間: 2021-9-22 16:19
sadv 發(fā)表于 2021-9-22 13:53
感謝各位的回復(fù),芯片是SQ013L,目前的代碼里面已經(jīng)非常精簡(jiǎn)了,所有的全局變量都是按位來定義的,使用了位 ...

感謝各位的回復(fù),開發(fā)環(huán)境是芯片官方提供的,沒有KEIL那么強(qiáng)大的功能,優(yōu)化效率也比較低,我們?cè)谑褂弥猩踔涟l(fā)現(xiàn)在函數(shù)中定義的臨時(shí)變量會(huì)一直占用空間,退出函數(shù)后空間得不到釋放的情況,導(dǎo)致本來就不多的資源更是捉襟見肘,為此只有定義兩個(gè)全局在變量在各個(gè)子函數(shù)中做臨時(shí)變量使用。為了節(jié)約資源所有的變量都是按位定義的,也盡量減少子函數(shù)的調(diào)用,此代碼將會(huì)經(jīng)過多位同事的手做一些修改給到不同客戶,大家都不會(huì)匯編,暫不考慮用匯編寫。
作者: 188610329    時(shí)間: 2021-9-22 16:22
sadv 發(fā)表于 2021-9-22 16:10
感謝,已經(jīng)做過嘗試,所有變量都是按位來定義的,也沒有用到這么大的數(shù)據(jù),8位就夠用了

那就在 子函數(shù) 不傳參方面嘗試。一旦子函數(shù)傳參,就會(huì)多出很多 MOV  如果,引用的變量固定,返回的變量也固定,可以試試。
還有 如果程序有很多 位操作 的話,可以嘗試用 unsigned char bdata   xxxx; 來定義字節(jié)變量,然后用 sbit 來定義每一個(gè)位, 那么在大量的,位定義的時(shí)候, 可以直接 用16進(jìn)制數(shù)對(duì)字節(jié)統(tǒng)一定義,畢竟改寫一個(gè) 字節(jié) 只需要 3個(gè)字節(jié)的程序, 改寫一個(gè)位就要 2個(gè)字節(jié)程序,改寫8個(gè)位就會(huì)需要16個(gè)字節(jié)程序,直接用字節(jié)方式改寫,就能省下 13個(gè)字節(jié)的程序。再不行就嘗試啃啃匯編了,我當(dāng)初也是為了壓縮壓縮再壓縮才學(xué)的匯編。用習(xí)慣后感覺在8位機(jī)編程來講,個(gè)人開發(fā),還是匯編用的更順手。就算合作開發(fā)的話,也可以自己負(fù)責(zé)寫底層,然后PUBLIC,對(duì)方extern 調(diào)用,這樣混合編寫也不錯(cuò)。
作者: sadv    時(shí)間: 2021-9-22 16:54
188610329 發(fā)表于 2021-9-22 16:22
那就在 子函數(shù) 不傳參方面嘗試。一旦子函數(shù)傳參,就會(huì)多出很多 MOV  如果,引用的變量固定,返回的變量也 ...

函數(shù)不傳參方面也已經(jīng)優(yōu)化過了,看了大家的說法感覺只有匯編才能解決了
作者: oblivionqqqqq    時(shí)間: 2021-9-22 17:25
小容量的單片機(jī),要用匯編,盡量精簡(jiǎn)代碼
作者: 黃youhui    時(shí)間: 2021-9-22 17:35
盡量別用庫(kù),printf函數(shù)所在的庫(kù),直接占據(jù)8K
作者: sadv    時(shí)間: 2021-9-22 17:48
黃youhui 發(fā)表于 2021-9-22 17:35
盡量別用庫(kù),printf函數(shù)所在的庫(kù),直接占據(jù)8K

不敢不敢,一個(gè)字節(jié)都要精打細(xì)算的,不敢這么奢侈,根本就沒用UART
作者: sadv    時(shí)間: 2021-9-22 17:48
oblivionqqqqq 發(fā)表于 2021-9-22 17:25
小容量的單片機(jī),要用匯編,盡量精簡(jiǎn)代碼

考慮中
作者: Y_G_G    時(shí)間: 2021-9-22 17:54
sadv 發(fā)表于 2021-9-22 16:06
確實(shí)是想替代義隆的單片機(jī)才找到的SQ013L,運(yùn)算方面沒有用到浮點(diǎn)類型的數(shù)據(jù),基本都是加減法和邏輯與或非 ...

24#也說,盡量別用的庫(kù),有庫(kù)函數(shù)并不是一條語(yǔ)句那么簡(jiǎn)單的
在C語(yǔ)言編譯器效率那么高,單片機(jī)片上資源越來越豐富的今天,匯編還有人在學(xué),就說明匯編還是有一定作用的
函數(shù)調(diào)用不用程序空間的,主要是函數(shù)本身
1,全局變量和靜態(tài)變量能不用就不用
2,庫(kù)函數(shù)能少用就少用
3,函數(shù)內(nèi)部的變量盡量用 unsigned char型,但這個(gè)在不同的編譯環(huán)境下優(yōu)化效果不一樣,有的壓根就沒用,但也可以試一下
4,函數(shù)盡量少一點(diǎn)
作者: 名字不是重點(diǎn)    時(shí)間: 2021-9-22 19:49
1、少用靜態(tài)數(shù)組 uchar code xxx[]={},少用全局標(biāo)志。
2、for語(yǔ)句步進(jìn)用減,不用加:for(a=8;a>0;a--),ASM指令有減一(為0)跳轉(zhuǎn),少有加一跳轉(zhuǎn)(多了判斷)
3、盡量不要多重調(diào)用,如:
    void a()調(diào)用void b();void b()又調(diào)用void C();void c()中又調(diào)用了void c().....(常見于各種顯示函數(shù))
4、不要同時(shí)開多個(gè)中斷,每一個(gè)中斷產(chǎn)生都會(huì)用到棧、都要保護(hù)現(xiàn)場(chǎng)。
5、短延時(shí)小于5個(gè)指令周期的盡量直接用空轉(zhuǎn)NOP,調(diào)用延函數(shù)一進(jìn)一出都費(fèi)事。

  
  
作者: angmall    時(shí)間: 2021-9-22 19:51
芯圣SQ013L是一顆採(cǎi)用高速低功耗CMOS工藝設(shè)計(jì)開發(fā)的8位元高性能精簡(jiǎn)指令單片機(jī), 內(nèi)部有1K*14位一次性可程式設(shè)計(jì)ROM(OTP-ROM),49*8位的資料記憶體(RAM),兩個(gè)雙向I/O口,1個(gè)8位Timer計(jì)時(shí)器/計(jì)數(shù)器。

最有效的辦法就是用匯編來寫
作者: hhh402    時(shí)間: 2021-9-23 01:32
這個(gè)單片機(jī)多少錢一片?資源這么少
作者: angmall    時(shí)間: 2021-9-23 07:27
hhh402 發(fā)表于 2021-9-23 01:32
這個(gè)單片機(jī)多少錢一片?資源這么少

這個(gè)單片機(jī)一片 ¥0.13
作者: slf252    時(shí)間: 2021-9-23 08:00
我也在用一款資源一樣的mcu,用C語(yǔ)言代碼寫不下,砍掉30%的功能,客戶勉強(qiáng)接受了
作者: 黃youhui    時(shí)間: 2021-9-23 08:30
hhh402 發(fā)表于 2021-9-23 01:32
這個(gè)單片機(jī)多少錢一片?資源這么少

STC11F04E   2塊一片
作者: wlg7705    時(shí)間: 2021-9-23 09:15
1.使用匯編語(yǔ)言編寫程序,自己安排存儲(chǔ)空間。
作者: wlg7705    時(shí)間: 2021-9-23 09:16
1.使用匯編語(yǔ)言,合理安排存儲(chǔ)空間
2.優(yōu)化算法,減少代碼量
作者: sadv    時(shí)間: 2021-9-23 10:28
slf252 發(fā)表于 2021-9-23 08:00
我也在用一款資源一樣的mcu,用C語(yǔ)言代碼寫不下,砍掉30%的功能,客戶勉強(qiáng)接受了

我們這是之前的MCU買不到了,給客戶找替代品找到這個(gè),本來功能不復(fù)雜,就是邏輯上的判斷和比較特別多,再刪功能就沒意義了。
作者: angmall    時(shí)間: 2021-9-23 12:57
黃youhui 發(fā)表于 2021-9-23 08:30
STC11F04E   2塊一片

2塊, 可以買超過15片了
作者: xianfajushi    時(shí)間: 2021-9-23 14:40
做個(gè)有趣的測(cè)試就知道C語(yǔ)言和匯編到底哪個(gè)能寫出占有更小的程序,也能測(cè)試出哪個(gè)優(yōu)化最好,之下復(fù)制一個(gè)提問.
通過按鍵SW2(連接在P2_0口)控制LED1~LED2的亮滅狀態(tài),要求如下: 1.系統(tǒng)上電后,LED1~LED2熄滅。 2.第一次按下SW2后,LED1點(diǎn)亮。 3.第二次按下SW2后,LED2點(diǎn)亮。 4.第三次按下SW2后,LED1熄滅。 5.第四次按下SW2后,LED2熄滅。 6.再次按下按鍵后,要求從步驟2開始進(jìn)入新的控制周期。
作者: xianfajushi    時(shí)間: 2021-9-23 15:05
本帖最后由 xianfajushi 于 2021-9-23 15:28 編輯

寫了一個(gè)不用數(shù)組的用判斷的

  1. unsigned char a=0;
  2. sbit k=P2^0;
  3. while(1)
  4. {
  5. if(!k)
  6. {
  7. ++a;
  8. while(!k);
  9. }
  10. if(a==1)P1=1;
  11. else if(a==2)P1=3;
  12. else if(a==3)P1=2;
  13. else {P1=a=0;}
  14. }
復(fù)制代碼

Program Size: data=9.0 xdata=0 code=71
作者: 00云夢(mèng)澤00    時(shí)間: 2021-9-23 15:35
這個(gè)需要和個(gè)人能力掛鉤的   計(jì)算機(jī)原理、匯編缺一不可   用C代碼精簡(jiǎn)不到最優(yōu)  如果能用機(jī)器語(yǔ)言更好  
作者: sadv    時(shí)間: 2021-9-23 16:21
00云夢(mèng)澤00 發(fā)表于 2021-9-23 15:35
這個(gè)需要和個(gè)人能力掛鉤的   計(jì)算機(jī)原理、匯編缺一不可   用C代碼精簡(jiǎn)不到最優(yōu)  如果能用機(jī)器語(yǔ)言更好

入行半年的我有點(diǎn)吃不消啊
作者: shumivan    時(shí)間: 2021-9-23 17:14
不斷優(yōu)化自己的代碼,拒絕冗余段
作者: 188610329    時(shí)間: 2021-9-23 19:42
sadv 發(fā)表于 2021-9-23 16:21
入行半年的我有點(diǎn)吃不消啊

基于,40樓的拋磚引玉…………
  1.                 K        BIT        P2.0

  2.                 CSEG        AT        0000H
  3. Start:           JB        K,Not_Press
  4.                    INC        A
  5.                    JNB        K,$
  6. Not_Press:    CJNE        A,#1,IF_2
  7.                    MOV        P1,#1
  8.                     AJMP        Start
  9. IF_2:            CJNE        A,#2,IF_3
  10.                     MOV        P1,#3
  11.                     AJMP        Start
  12. IF_3:             CJNE        A,#3,IF_x
  13.                     MOV        P1,#2
  14.                     AJMP        Start
  15. IF_x:             CLR        A
  16.                     MOV        P1,A
  17.                     AJMP        Start

  18. END
復(fù)制代碼
Program Size: data=8.0 xdata=0 code=36
我把他的程序用,匯編寫了一遍,你可以比較兩者大小的差距。

作者: hhh402    時(shí)間: 2021-9-23 20:57
怎么便宜的單片機(jī)資源實(shí)在是不夠用的話可以考慮用2片呀,
作者: 00云夢(mèng)澤00    時(shí)間: 2021-9-23 21:32
sadv 發(fā)表于 2021-9-23 16:21
入行半年的我有點(diǎn)吃不消啊

師傅領(lǐng)進(jìn)門  修行在個(gè)人  那只能選擇高級(jí)點(diǎn)的單片機(jī)了   就不用考慮資源了

作者: Y_G_G    時(shí)間: 2021-9-24 10:44
188610329 發(fā)表于 2021-9-23 19:42
基于,40樓的拋磚引玉…………
Program Size: data=8.0 xdata=0 code=36
我把他的程序用,匯編寫了一遍 ...

人家是PIC的匯編,不一樣的
PIC有的匯編是沒有比較的
MOV        P1,#1也是不行的,早先的PIC是不能這樣的,不能直接對(duì)進(jìn)行傳送的,只能通過W(PIC的累加器,相當(dāng)于A)進(jìn)行傳送
你這個(gè)在PIC是要這樣:
MOV        A,#1
MOV        P1,A
PIC也沒有比較相等的指令,只能通過減法進(jìn)行比較
PIC也沒有JNB這種指令,它只有條件跳過下一條指令,它只能跳過下一條指令,不能指定標(biāo)號(hào)跳轉(zhuǎn).....
作者: wulin    時(shí)間: 2021-9-24 10:46
sadv 發(fā)表于 2021-9-22 13:53
SQ013L

這種極低價(jià)格的單片機(jī)只適用于對(duì)成本非常敏感且無安全等級(jí)要求的低附加值產(chǎn)品。樓主也不要指望用其開發(fā)什么高大上的玩意。真想玩就老老實(shí)實(shí)學(xué)匯編。
作者: 188610329    時(shí)間: 2021-9-24 15:24
Y_G_G 發(fā)表于 2021-9-24 10:44
人家是PIC的匯編,不一樣的
PIC有的匯編是沒有比較的
MOV        P1,#1也是不行的,早先的PIC是不能這樣 ...

誠(chéng)如 47樓所說, 這段代碼只是讓你看看 匯編 和 C 之間的程序大小差距,你好有個(gè)概念,正式編寫的時(shí)候,下載由該單片機(jī)提供的 匯編碼表,就算他是抄的PIC的匯編,也可能會(huì)增減部分代碼, 比如WCH 的51系列 他就在51匯編的基礎(chǔ)上,加了一條,補(bǔ)足了256條匯編指令。用起來更加舒服。你的SQ013L要是也有類似的增補(bǔ),分分鐘匯編比C還好用。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1