极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27554|回复: 11

小白发现的Arduino程序减肥法

[复制链接]
发表于 2018-2-14 03:22:22 | 显示全部楼层 |阅读模式
本帖最后由 yqfans 于 2018-2-14 23:46 编辑

就是这个按键控制的教程,当按键按下,红色的灯亮,按键松开,蓝色灯亮。很简单,程序也非常的好写,只是我的灯接的多了些。

以下是我减肥的程序:

  1. void setup()
  2. {
  3. DDRB=B11111110;              //定义8号接口为输入接口
  4. PINB=B00000001;               //定义8号引脚为高电平(使用内置上拉电阻)
  5. DDRD=B11111111;            //定义小灯接口为输出接口(0-7号共阳接法)
  6. }

  7. void loop()
  8. {
  9. if(PINB==0)                          //检测按键是否按下,
  10.   
  11.   PORTD = B01010100;       //按下时3个红色LED亮
  12. else                    
  13.   PORTD = B10101010;     //不按3个蓝色的LED亮
  14. }
复制代码


就这么一点,没有头文件,没有库文件,没有定义变量,看上去非常的精简,运行下也只有492B,我十分喜欢,原理好像是利用单片机内部寄存器来编写程序,一样能在Ardunio IDEl里跑,但是写起来就要费脑子了,最近在研究BASCOM—AVR,然后就写了这个程序,分享给大家,请参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2018-2-18 09:04:02 | 显示全部楼层
arduino 的目的,就是牺牲精简换来编程的便利性。你这又给还回去了。
回复 支持 反对

使用道具 举报

发表于 2018-2-18 10:21:24 | 显示全部楼层
很好上面程序的行数其实并不比原版的程序多,非常有启发性的例子
回复 支持 反对

使用道具 举报

发表于 2018-2-19 13:49:50 | 显示全部楼层
本帖最后由 shouzama 于 2018-2-19 14:28 编辑

依我接觸 ARDUINO 這些日子以來的想法,以 UNO 來說,
BOOTLOADER 佔約 2KB,ATmega328P 可用的程式空間
=32-2=30KB,變數空間 2048B

在這個限制下,除非就差那麼一些些 BYTES,硬擠擠不下,
擴充又變得相對複雜不划算,才會去考慮局部/全面精簡程式

第一個可以精簡的是 BOOTLOADER,直接將 ATmega328P
接上 USB2TTL 燒錄器燒錄,就可以拿回 2KB (實做上也可
最小化系統)

不夠? 精簡程式碼,重覆的程式區段就做成函式,以函式
呼叫的方式,犠牲一點執行時間換取程式碼的空間

還不夠? 試著放棄別人寫好的庫,自己寫程式取代,這點
並非做不到,只是要深入瞭解所要控制的元件的硬體及
信號型式/時脈,這部份我想是玩 ARDUINO 能免則免的部份吧

如果程式空間夠用、執行速度夠快,我不會想去研究精簡
程式的方法,如同 maxims 站友所言,那不是 ARDUINO 的
開發精神(訴求)所在,想要精簡,我會像以前那樣再用組合語言
寫 8051,不會轉學 C 玩 ARDUINO

也就是說,以樓主的範例程式而言,沒有精簡的必要,但如果
程式大到差一點點能擠進去的話,相對就很有用處了,利用關鍵字
我找到了一份參考文:
從 Arduino 到 AVR 晶片(1) -- AVR 晶片與 IO ports 範例 (作者:Cooper Maa)

剛剛試著編譯了一下他舉的 blink 程式,一般寫法:
草稿碼使用了 928 bytes (2%) 的程式儲存空間。上限為 32256 bytes。
全域變數使用了 9 bytes (0%) 的動態記憶體,剩餘 2039 bytes 給區域變數。上限為 2048 bytes 。

DDRx、PORTx 的寫法:
草稿碼使用了 644 bytes (1%) 的程式儲存空間。上限為 32256 bytes。
全域變數使用了 9 bytes (0%) 的動態記憶體,剩餘 2039 bytes 給區域變數。上限為 2048 bytes 。

組譯結果程式碼大小有明顯差別,值得一試,不過我認為還是
寫幾個巨集指令取代,程式的便攜性、判讀性可以大幅改善
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-19 23:28:04 | 显示全部楼层
maxims 发表于 2018-2-18 09:04
arduino 的目的,就是牺牲精简换来编程的便利性。你这又给还回去了。

是的,确实这样是用到了AVR单片机的知识,比较底层,但是我觉得,例如在定义I/O口的时候,不用写那么多条pinMode,偶尔用用DDRD=B11111111;这个也很方便,就好像C语言里混着汇编语言一样,混着来,解决问题一定是双管齐下,事倍功半,这只是个思路启发。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-19 23:33:00 | 显示全部楼层
wing 发表于 2018-2-18 10:21
很好上面程序的行数其实并不比原版的程序多,非常有启发性的例子

对,但是程序体积却小了很多,只有492B的大小。可能是没有用到定义变量吧?不太清楚。硬件上也少用了一个电阻,用了内部的上拉电阻(大概是40K左右),结构简单明了。对,我就是想做个启发,类似C语言编程里混合汇编语言一样的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-19 23:39:45 | 显示全部楼层
shouzama 发表于 2018-2-19 13:49
依我接觸 ARDUINO 這些日子以來的想法,以 UNO 來說,
BOOTLOADER 佔約 2KB,ATmega328P 可用的程式空間
=32 ...

我就是觉得这样的程序看起来有美感,而且十分清晰明了。也许这种方法可以用来编写*.h的库文件,让库文件瘦身
回复 支持 反对

使用道具 举报

发表于 2018-2-20 11:26:16 | 显示全部楼层
其实这个就是节约了一堆宏定义~~~
回复 支持 反对

使用道具 举报

发表于 2018-2-21 00:48:12 | 显示全部楼层
本帖最后由 最帅的老饼 于 2018-2-21 11:10 编辑

/*
*  转载于某网站,作者:Zeyo
*  在Arduino UNO 测试通过.
*  转过来给你当参考用。
*/

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

int main(void){
  DDRB |= ( 1 <<PORTB5);
  while (1){
    PORTB |= ( 1 <<PORTB5);
    _delay_ms (1000);
    PORTB &= ~(1 <<PORTB5);
     _delay_ms (1000);
  }
}
回复 支持 反对

使用道具 举报

发表于 2018-2-21 01:02:18 | 显示全部楼层
本帖最后由 最帅的老饼 于 2018-2-21 11:11 编辑

/* 在Zeyo的指导下
   这个闪灯只用程序空间156 字节,变量空间 0 字节
   在上面代码的基础作出修改,空间又节约了一点。
*/

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 16000000UL

int main() {
      DDRB |= ( 1<<PORTB5 );
      while (1){
             bitSet(PINB,5);
             _delay_ms(1000);   
    }
}
回复 支持 反对

使用道具 举报

发表于 2018-2-21 20:59:37 | 显示全部楼层
其实,学过计算机的都知道精简代码,但是要看优化的目的
有的优化了体积,有的优化了运行速度。
有的是为了更快速简单的开发。
论运行效率,直接用汇编来开发是运行效率最高的(只是这货太累,各种JMP、jz,JNZ,NUL、基址、变址、POP、PUSH)
直接用各种循环和调用是最省空间的(也就是所谓的模块化编程,代价就是各种跳转效率会降低)
最简单,容易上手的就是各种高级语言,比如C (是的,虽然C有着近乎汇编的代码效率,但还是会有差距)
ARDUINO ide使用的实际上就是C代码,本身就不是为了超小体积来的,目的就是代码尽量没那么复杂
大家都能看懂。。。否则直接上汇编更小,但是要考虑广大受众。。。
当年大学里面1学期学8086汇编,学期结束能用MASM出程序的几乎没有(是的 各种运行失败,因为要考虑OS的存在,要做各种堆栈)能用MASM开发一个1M大小的程序那都是玩了多少年的老鸟干的活。
回复 支持 反对

使用道具 举报

发表于 2018-2-21 22:14:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 05:29 , Processed in 0.051027 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表