7705|25

695

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

50字节实现STM32L011 Blink. [复制链接]

 
仅仅50字节,就可以实现LED闪烁.代码展示.纯挑战极限.
不要问为什么没C代码,没用C写,不要问为什么没汇编代码,汇编出来比这个大,这个是汇编后再优化的.PB3接一个LED,主芯片是STM32L011K4,也是那个Nucleo-L011.

手上有板子可以试试.反正我当时11.11团购的,估计很多人有.

hex: stm32l011-nucleo-blink.zip (277 Bytes, 下载次数: 16)







最新回复

我觉得依赖未定义的部分是 00 还是 FF 这个办法不好,如果是任意值都能跑就pass,否则算犯规  详情 回复 发表于 2017-1-20 09:10

赞赏

1

查看全部赞赏

点赞 关注

回复
举报

7608

帖子

2

TA的资源

五彩晶圆(高级)

推荐
 
本帖最后由 freebsder 于 2017-1-18 00:24 编辑

比较有趣的话题。
搞这种事的人现在搞得人不多,因为资源越来越丰富。。。
楼主这个,1是怎么看thumb指令,2是直接在int vector里面写reset handler,这点其实和arm7时代的fast irq一个的意思,3是只处理IO的模式和输出高低,其实反到汇编之后是一目了然的。
两条命令:
arm-none-eabi-objcopy -I ihex -O binary stm32l011-nucleo-blink.hex stm32l011-nucleo-blink.bin
arm-none-eabi-objdump -b binary -m arm -M force-thumb -EL -D stm32l011-nucleo-blink.bin

  1.    
  2.    0:        0009              movs        r1, r1
  3.    2:        0000              movs        r0, r0
  4.    4:        0009              movs        r1, r1               ;reset地址0x8,最低位置1表示thumb,所以数据是0x9
  5.    6:        0000              movs        r0, r0
  6.    8:        4806              ldr        r0, [pc, #24]        ; (0x24)    0x4002102c
  7.    a:        4907              ldr        r1, [pc, #28]        ; (0x28)    0x2
  8.    c:        6001              str        r1, [r0, #0]
  9.    e:        4807              ldr        r0, [pc, #28]        ; (0x2c)    0x50000400
  10.   10:        4907              ldr        r1, [pc, #28]        ; (0x30)   7fff (后面都可默认flash擦写为FF)
  11.   12:        6001              str        r1, [r0, #0]
  12.   14:        6942              ldr        r2, [r0, #20]
  13.   16:        404a              eors        r2, r1
  14.   18:        6142              str        r2, [r0, #20]
  15.   1a:        4b06              ldr        r3, [pc, #24]        ; (0x34)
  16.   1c:        1c5b              adds        r3, r3, #1
  17.   1e:        4293              cmp        r3, r2
  18.   20:        d1fc              bne.n        0x1c                 ;和 0x1c 做计数循环
  19.   22:        e7f7              b.n        0x14                    ;和 0x14 做外部循环的IO异或闪灯
复制代码
$hexdump stm32l011-nucleo-blink.bin

  1. 0000000 09 00 00 00 09 00 00 00 06 48 07 49 01 60 07 48
  2. 0000010 07 49 01 60 42 69 4a 40 42 61 06 4b 5b 1c 93 42
  3. 0000020 fc d1 f7 e7 2c 10 02 40 02 00 00 00 00 04 00 50
  4. 0000030 7f ff                                          
  5. 0000032
复制代码




点评

free树树,我看这代码还可以继续优化,搞起来!  详情 回复 发表于 2017-1-18 01:04
free树树果然是老当益壮,不服不行!  详情 回复 发表于 2017-1-18 00:46

赞赏

1

查看全部赞赏

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 

回复

1万

帖子

25

TA的资源

版主

沙发
 
适当介绍一下吧
 
 
 

回复

6040

帖子

196

TA的资源

版主

板凳
 
本帖最后由 lcofjp 于 2017-1-18 00:46 编辑

不懂帮顶,手里没有stm32,看free树树给我们讲解。
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

5
 
@soso @eric_wang 实在受不了这个编辑器了,老掉字,怎么编辑都不行。
被吃掉的编辑也贴不上去,注释写好也没了,真是麻烦。


点评

测试了几次确实存在这个问题 因为涉及到JS的修改,这种修改有点像牵一发而动全身,会造成其他插件出现bug,所以暂时用了一个比较初级的方案:插入代码点提交会像图中这种展示出来,虽然不好看,但是能保证代码不被  详情 回复 发表于 2017-1-18 11:04
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

6040

帖子

196

TA的资源

版主

6
 
freebsder 发表于 2017-1-18 00:06
比较有趣的话题。
搞这种事的人现在搞得人不多,因为资源越来越丰富。。。
楼主这个,1是怎么看thumb指令 ...

free树树果然是老当益壮,不服不行!
 
 
 

回复

6040

帖子

196

TA的资源

版主

7
 
freebsder 发表于 2017-1-18 00:06
比较有趣的话题。
搞这种事的人现在搞得人不多,因为资源越来越丰富。。。
楼主这个,1是怎么看thumb指令 ...

free树树,我看这代码还可以继续优化,搞起来!

点评

堆栈没用,所以烧写的时候可以偏移4个字节出来,最后的FF抹掉利用Flash擦后的默认值减掉1个,0x2那里换成字节寻址减掉3个,初略看8个字节减少8/50=16%了  详情 回复 发表于 2017-1-18 09:25
 
 
 

回复

6040

帖子

196

TA的资源

版主

8
 
记得十多年前看过一个程序,编程比赛的获奖作品,是一个DOS程序,8个字节大小。

点评

http://www.pouet.net/prodlist.php?type%5B%5D=32b&platform%5B%5D=MS-Dos&page=1 这个论坛有很多类似作品  详情 回复 发表于 2017-1-18 10:40
 
 
 

回复

695

帖子

0

TA的资源

一粒金砂(高级)

9
 
8个字节也只能放个向量什么都干不了。
 
 
 

回复

695

帖子

0

TA的资源

一粒金砂(高级)

10
 
再节省也是个位数字节内
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

11
 
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

12
 
lcofjp 发表于 2017-1-18 01:04
free树树,我看这代码还可以继续优化,搞起来!

堆栈没用,所以烧写的时候可以偏移4个字节出来,最后的FF抹掉利用Flash擦后的默认值减掉1个,0x2那里换成字节寻址减掉3个,初略看8个字节减少8/50=16%了

点评

这还真不行,l011从0x04开始取,后面可以,不过得保证擦为0  详情 回复 发表于 2017-1-18 09:39
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

695

帖子

0

TA的资源

一粒金砂(高级)

13
 
本帖最后由 cl17726 于 2017-1-18 10:48 编辑
freebsder 发表于 2017-1-18 09:25
堆栈没用,所以烧写的时候可以偏移4个字节出来,最后的FF抹掉利用Flash擦后的默认值减掉1个,0x2那里换成 ...

这还真不行,l011从0x04开始取,后面可以,不过得保证擦为0,l011擦后为0,字节寻址会hardfault,具体还不知道原因,有知道吗
1)末位FF不能去掉,不然狂闪不止.
2)手册表示,这个能去掉吗?

The boot mode configuration is also re-sampled when exiting from Standby mode, except
for category 1 devices where BOOT0 pin is latched on NRST rising edge. Consequently the
boot mode configuration must not be modified in Standby mode (except for category 1
devices). After this startup delay has elapsed, the CPU fetches the top-of-stack value from
address 0x0000 0000, then starts code execution from the boot memory at 0x0000 0004

3)字节寻址正确做法怎么切换呢?我发现怎么改都HARDFAULT PS:找到问题了,原来是这个核心只接受WORD寻址.



假设擦后代码全位0,复合寻址规定,那么可以这样.


09        00        00        00        09        00        00        00        06        48        07        49        01        60        07        48
01        60        42        69        4A        40        42        61        05        4B        5B        1C        93        42        FC        D1
F7        E7        00        00        2C        10        02        40        7F        FF        0F        00        00        04        00        50



                LDR R0,=0x4002102C
                LDR R1,=0x000FFF7F
                STR R1, [R0]
                LDR R0,=0x50000400
                STR R1, [R0]
Application
                LDR R2,[R0,#0x14]
                EORS R2,R2,R1
                STR R2,[R0,#0x14]
                LDR R3,=0x000F0000
Delay
                ADDS     R3,R3,#1
                CMP      R3,R2
                BNE      Delay
                B Application
对齐要求,取指要求等等限制,估计都没的话可以到40B+吧.


点评

我手里没器件,就不尝试了。 只针对你这个话题,0x2那个,你可以改成立即数寻址,把0x2直接做到指令里面,把这个字节也减掉。前面的堆栈抹掉之后,烧录的时候从0x08000004开始烧。 另外,擦除不应该是0xff吗?你这  详情 回复 发表于 2017-1-18 10:17
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

14
 
cl17726 发表于 2017-1-18 09:39
这还真不行,l011从0x04开始取,后面可以,不过得保证擦为0,l011擦后为0,字节寻址会hardfault,具体还 ...

我手里没器件,就不尝试了。
只针对你这个话题,0x2那个,你可以改成立即数寻址,把0x2直接做到指令里面,把这个字节也减掉。前面的堆栈抹掉之后,烧录的时候从0x08000004开始烧。
另外,擦除不应该是0xff吗?你这个怎么是0x0.

点评

前4可以是其他数,但不能为0,不能为全f,st用来区分不知道什么东西.所以还是得从0x08000000烧,哎  详情 回复 发表于 2017-1-18 10:47
我也是写时候才发现这个擦是0x00,为什么会按WORD取呢,因为里面有个prefetch,然后那个一次性取一次word当指令用... 关掉就可以按byte,但是更多了.  详情 回复 发表于 2017-1-18 10:45
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

15
 
lcofjp 发表于 2017-1-18 05:20
记得十多年前看过一个程序,编程比赛的获奖作品,是一个DOS程序,8个字节大小。

http://www.pouet.net/prodlist.ph ... 5B%5D=MS-Dos&page=1

这个论坛有很多类似作品

点评

终于等到地址了,以前收藏过,丢了就再没找到了。谢谢  详情 回复 发表于 2017-1-18 11:12
 
 
 

回复

695

帖子

0

TA的资源

一粒金砂(高级)

16
 
freebsder 发表于 2017-1-18 10:17
我手里没器件,就不尝试了。
只针对你这个话题,0x2那个,你可以改成立即数寻址,把0x2直接做到指令里面 ...

我也是写时候才发现这个擦是0x00,为什么会按WORD取呢,因为里面有个prefetch,然后那个一次性取一次word当用... 关掉就可以按byte,但是更多了.

点评

m0+支持字节寻址能力,ldr,str后面加b后缀,预取是预取,封装在API(architect programming interface)之下的,你看不到也操作不了。 如果这个器件erase擦除是0,我只能说太尼玛特立独行的奇葩了。 如果sp需要符合  详情 回复 发表于 2017-1-18 11:26
 
 
 

回复

695

帖子

0

TA的资源

一粒金砂(高级)

17
 
freebsder 发表于 2017-1-18 10:17
我手里没器件,就不尝试了。
只针对你这个话题,0x2那个,你可以改成立即数寻址,把0x2直接做到指令里面 ...

前4可以是其他数,但不能为0,不能为全f,st用来区分不知道什么东西.所以还是得从0x08000000烧,哎
 
 
 

回复

9176

帖子

6

TA的资源

管理员

18
 
freebsder 发表于 2017-1-18 00:20
@soso @eric_wang 实在受不了这个编辑器了,老掉字,怎么编辑都不行。
被吃掉的编辑也贴不上去,注释写好 ...

测试了几次确实存在这个问题
因为涉及到JS的修改,这种修改有点像牵一发而动全身,会造成其他插件出现bug,所以暂时用了一个比较初级的方案:插入代码点提交会像图中这样展示出来,虽然不好看,但能保证代码不被吃掉,后续我们会继续跟进找出更好的解决办法


加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

19
 
EETUX 发表于 2017-1-18 10:40
http://www.pouet.net/prodlist.php?type%5B%5D=32b&platform%5B%5D=MS-Dos&page=1

这个论坛有很多类 ...

终于等到地址了,以前收藏过,丢了就再没找到了。谢谢
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

20
 
cl17726 发表于 2017-1-18 10:45
我也是写时候才发现这个擦是0x00,为什么会按WORD取呢,因为里面有个prefetch,然后那个一次性取一次word当 ...

m0+支持字节寻址能力,ldr,str后面加b后缀,预取是预取,封装在API(architect programming interface)之下的,你看不到也操作不了。
如果这个器件erase擦除是0,我只能说太尼玛特立独行的奇葩了。
如果sp需要符合什么要求,那应该是st用作验证了,我没记错的话freescale的器件是在其他某个地址写入一串特定值,各家不一样。看来这4个字节是不能用erase的默认了。

点评

刚试验一下,依然hardfault,这个擦后是0,我猜他rom也是eeprom构造,因为片内有eeprom,连续编址的  详情 回复 发表于 2017-1-18 13:02
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表