矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3394|回复: 13

想学RTOS,看着介绍不错,能用汇编写吗?

[复制链接]
     
发表于 2017-9-2 23:15:59 | 显示全部楼层 |阅读模式
前面有个前辈说学高级单片机要向RTOS方向发展,我百度搜了一下感觉不错啊,写程序比裸机编程容易。

这个要怎么学啊,不会C语言能不能学,我看别的论坛的发的那些东西完全看不懂,感觉好复杂啊。


焊接电路搞实物成本太高,玩玩写程序也就浪费个电钱,贴出来这两天搞的个小程序。

自己瞎写个简单多任务调度, 目前创建了两个任务,一个空闲任务一直保持就绪状态,另一个每隔一段时间执行一次。

我这个是完全手打的不是网上抄袭的也不是反汇编的, 修改了上百次才成功

单片机还是STM32F030F4P6,系统时钟8M,程序占用476字节储存空间

  1. @ stm32f030f4p6 asm
  2. @ os
  3.          .thumb                 
  4.          .syntax unified
  5. .section .data
  6.         .equ duizhanding,       0x20001000 @ 堆栈顶
  7.         .equ dqrwyxj,           0x20000044 @ 当前任务优先级
  8.         .equ xtzgyxj,           0x20000048 @ 系统里最高优先级
  9.         .equ dangqian,          0x2000004c @ 当前任务指向控制块里指针
  10.         .equ dengyunxing,       0x20000050 @ 待运行任务指向控制块里指针
  11.         .equ jiuxubiao,         0x20000054 @ 就绪查找表8个任务
  12.          @ 保留0X20
  13.         .equ renwubiao,         0x20000074 @ 指向任务控制块地址的指针表
  14.         @保留0x20
  15.         .equ renwukongzhikuai,  0x20000094 @ 任务控制块地址
  16.         @每个控制块4个数据,+0堆栈顶,+4任务时间,+8优先级,+C
  17.        
  18.         .equ renwuduizhan,        0x20000500 @ 任务堆栈顶
  19.        
  20.        
  21.        
  22. .section .text
  23. vectors:          @向量表
  24.         .word duizhanding                     
  25.         .word _start + 1             @复位向量
  26.         .word _nmi_handler + 1  
  27.         .word _hard_fault  + 1  
  28.         .word 0
  29.         .word 0   
  30.         .word 0
  31.         .word 0
  32.         .word 0
  33.         .word 0
  34.         .word 0
  35.         .word _svc + 1
  36.         .word 0
  37.         .word 0
  38.         .word _pendsvzhongduan + 1
  39.         .word _systickzhongduan + 1
  40.        
  41.        

  42. _start:
  43. _shizhong:                     @时钟设置
  44.         ldr r2, = 0x40022000   @FLASH访问控制
  45.         movs r1, # 0x32
  46.         str r1, [r2]
  47.         ldr r0, = 0x40021000 @ rcc
  48.         @0x34时钟控制寄存器 2 (RCC_CR2)
  49.         movs r1, # 0x01
  50.         str r1, [r0, # 0x34]  @ HSI开14M时钟
  51. _dengdai14mshizhongwending:    @等14M时钟稳定
  52.         ldr r1, [r0, # 0x34]
  53.         lsls r1, r1, # 30     @ 左移30位
  54.         bpl _dengdai14mshizhongwending  @ 等待14M时钟稳定

  55. _neicunqingling:                         @ 0x1000的内存清零
  56.                                          @ 1K=1024BIT=0X400
  57.         ldr r0, = 0x20000000
  58.         movs r1, # 0
  59.         ldr r3, = 0x1000                  
  60. _neicunqinglingxunhuan:                   @ 内存清零循环
  61.         subs r3, # 4                    
  62.         str r1, [r0, r3]                  
  63.         bne _neicunqinglingxunhuan                @

  64. _systick:                                  @ systick定时器初始化
  65.         @ 0xe000ed20 30-31 youxianji
  66.         @ 22-23 PENDSV
  67.         ldr r0, = 0xe000ed20
  68.         ldr r1, = 0x00c00000
  69.         str r1, [r0]                      @设置优先级
  70.        
  71.         ldr r0, = 0xe000e010
  72.         ldr r1, = 100   
  73.         str r1, [r0, # 4]
  74.         str r1, [r0, # 8]
  75.         movs r1, # 0x07
  76.         str r1, [r0]

  77. _renwuchushihua1:                       @ 空闲任务初始化
  78.         ldr r0, = renwuduizhan          @ 任务堆栈顶            
  79.         ldr r1, = _kongxianrenwu        @ 空闲任务地址
  80.         adds r1, r1, # 1                @ +1进入thumb
  81.         ldr r2, = 0x01000000            @ xpsr
  82.         movs r3, # 0                    
  83.         mov r7, r2                      @ pc
  84.         mov r6, r1                     
  85.         mov r5, r3                       
  86.         mov r4, r3
  87.         mov r12, sp                     @ 当前堆栈指针放到R12
  88.         mov sp, r0                      @ 当前堆栈指针等于任务堆栈顶
  89.         push {r0-r7}                    @ 把刚才数据保存到任务堆栈
  90.         push {r4-r7}                    
  91.         ldr r0, = renwukongzhikuai      @ 任务控制块地址
  92.         ldr r1, = renwuduizhan          @ 任务堆栈顶
  93.         str r1, [r0]                    @ 空闲任务的堆栈顶写到任务控制块

  94.        
  95.         ldr r1, = renwubiao             @ 任务表
  96.          
  97.         str r0, [r1]                    @ 把任务控制块地址写到任务表

  98.        
  99. _renwu1chushihua:                     @ 同上面一样,只是地址偏移
  100.         ldr r0, = renwuduizhan
  101.         ldr r1, = 0x100
  102.         subs r0, r0, r1         
  103.         ldr r1, = _renwu1
  104.         adds r1, r1, # 1
  105.         ldr r2, = 0x01000000
  106.         movs r3, # 0
  107.         mov r7, r2
  108.         mov r6, r1
  109.         mov r5, r3
  110.         mov r4, r3
  111.         mov sp, r0
  112.         push {r0-r7}       
  113.         push {r0-r3}
  114.         ldr r0, = renwukongzhikuai
  115.         ldr r1, = renwuduizhan
  116.         ldr r2, = 0x100
  117.         subs r1, r2
  118.         adds r0, # 0x10
  119.         str r1, [r0]
  120.        
  121.         ldr r1, = renwubiao
  122.         str r0, [r1, # 0x04]
  123.        

  124.         ldr r0, = jiuxubiao           @ 就绪表
  125.         movs r1, # 1                  
  126.         str r1, [r0]                  @ 空闲任务一直就绪
  127.         str r1, [r0, # 0x04]          @ 任务1就绪

  128.         mov sp, r12                   @ 恢复堆栈指针

  129.         movs r0, # 0
  130.         msr psp, r0               @ PSP清零

  131.         bl _diaodu                    @ 自动调度

  132. _dddd:
  133.         b _dddd

  134. _kongxianrenwu:                        @ 空闲任务
  135.         ldr r0, = 0x100                @ 任务1延时时间
  136.         bl _renwushijian               @ 判断任务1到没到,到了执行调度
  137.         ldr r0, = 0x20000704           @ 空闲任务执行次数
  138.         ldr r1, [r0]
  139.         adds r1, r1, # 4
  140.         str r1, [r0]
  141.         b _kongxianrenwu
  142.        
  143. _renwu1:
  144.         ldr r0, = jiuxubiao           @ 就绪表
  145.         movs r1, # 0
  146.         str r1, [r0, # 0x04]          @ 任务1放开CPU
  147.         ldr r0, = 0x20000700          @ 任务1执行次数
  148.         ldr r1, [r0]
  149.         adds r1, r1, # 1
  150.         str r1, [r0]
  151.         bl _diaodu                    @ 调度
  152.         b _renwu1

  153. _renwushijian:                        @ 任务多长时间执行一次
  154.         ldr r2, = renwukongzhikuai    @ 任务控制块
  155.         ldr r1, [r2, # 0x14]          @ 读出任务1时间
  156.         cmp r1, r0                    @ 等不等于R0
  157.         bls _renwushijianfanhui       @ 小于返回
  158.         ldr r0, = jiuxubiao           @ 大于执行我
  159.         movs r1, # 1                 
  160.         str r1, [r0, # 0x04]          @ 就绪表里面任务1写1表示就绪
  161.         movs r1, # 0
  162.         str r1, [r2, # 0x14]          @ 清零任务1时间
  163.         b _diaodu                    @ 调度
  164. _renwushijianfanhui:
  165.         bx lr
  166. _diaodu:
  167.         ldr r0, = jiuxubiao          @就绪表
  168.         movs r1, # 0x08              @ 8个任务, 每个任务用32位表示
  169.         lsls r1, # 2                 @ R1等于32
  170. _zhaozuigao:                         @ 从高开始减,找最高优先级任务
  171.         subs r1, r1, # 4              
  172.         ldr r2, [r0, r1]
  173.         cmp r2, # 1
  174.         bne _zhaozuigao              @循环找,由于空闲任务一直就绪
  175.                                      @没有别的任务就执行空闲的
  176. _zhaodaozuigao:                      @ 找到了最高优先级的了
  177.         ldr r0, = renwubiao          @ 任务表
  178.         adds r0, r1                  @ 任务表指针偏移
  179.         ldr r2, = dengyunxing        @ 等运行
  180.         str r0, [r2]                 @ 任务表偏移指针写道等运行
  181.         ldr r0, = 0xe000ed04         @ 触发pendsv中断
  182.         ldr r1, = 0x10000000
  183.         str r1, [r0]
  184.         bx lr
  185.        
  186. _nmi_handler:
  187.         bx lr
  188. _hard_fault:
  189.         bx lr
  190. _svc:
  191.         bx lr
  192. _pendsvzhongduan:             @PENDSV中断
  193.         cpsid i               @ 关中断
  194.         mrs r0, psp           @ 读PSP当前地址到R0
  195.         cmp r0, # 0           @ r0和0比较
  196.         beq _qiehuanrenwu     @ 等于0执行任务切换
  197.         mov r12, sp           @ 堆栈指针保存到R12
  198.         mov sp, r0            @ SP等于r0
  199.         push {r4-r7}          @ 把R4-R7保存到堆栈最低四个32位
  200. _qiehuanrenwu:                @ 切换任务
  201.         ldr r0, = dangqian    @ 当前任务指针
  202.         ldr r1, = dengyunxing @ 等待运行指针
  203.         ldr r2, [r1]          @ 取出任务表里的指针
  204.         str r2, [r0]          @ 任务表里的指针写到待运行指针
  205.         ldr r0, [r2]          @ R0等于任务控制块地址表
  206.         ldr r0, [r0]          @ 取出任务堆栈顶
  207.         subs r0, # 0x30       @ R0等于堆栈底
  208.         mov sp, r0            @ SP等于R0
  209.         pop {r4-r7}           @ 弹出R4-R7
  210.         mov r1, lr            @ lr写到R1
  211.         movs r2, # 0x04       @ R2等于0X04 选择LR第2位
  212.         orrs r1, r2           @ R1或R2
  213.         mov lr, r1            @ 写回到LR
  214.         mov r0, sp            @ R0等于堆栈底加0X10
  215.         msr psp, r0           @ 写到PSP
  216.         mov sp, r12           @ 恢复SP
  217.         cpsie i               @ 开中断
  218.         bx lr                 @ 返回
  219. _systickzhongduan:
  220.         ldr r0, = 0xe0000d04
  221.         ldr r1, = 0x02000000
  222.         str r1, [r0]                 @ 清除SYSTICK中断
  223.         ldr r0, = renwukongzhikuai   @ 任务控制块
  224.         ldr r1, [r0, # 0x14]         @ 任务1的任务时间
  225.         adds r1, r1, # 1             @ 加1
  226.         str r1, [r0, # 0x14]         @ 写回去
  227.         bx lr                        @ 返回
复制代码

评分

1

查看全部评分

     
 楼主| 发表于 2017-9-2 23:24:17 | 显示全部楼层
高亮显示执行结果
0X20000704是空闲任务执行次数
0x20000700是任务1执行次数

截图_2017-09-02_22-55-22.png

程序文件

osshiyan.zip (10.74 KB, 下载次数: 90)


评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2017-9-3 10:03:04 | 显示全部楼层
据说RTOS价格昂贵,比如VxWorks,要上数百万元。不过,要适合多种CPU,就要用高级语言编写。期待楼主更成熟的RTOS。
回复 支持 反对

使用道具 举报

     
发表于 2017-9-3 10:51:04 | 显示全部楼层
汇编难度大,但代码精练,执行效率高。
回复 支持 反对

使用道具 举报

     
发表于 2017-9-3 11:08:22 | 显示全部楼层
还是用FreeRTOS吧,完全免费的。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-9-3 11:39:00 | 显示全部楼层
la45088d1 发表于 2017-9-3 09:26
你可以自己写一个操作系统,没问题。但是,一,你对操作系统了解有多少,涉及到很多的概念还有许多技巧,没 ...

没打算搞操作系统原理还不懂呢,就算操作系统再好也打不了坦克打不了飞机。

还是学实物的东西好,比如电机和液压控制,单片机上挂上个操作系统除了多占用资源有啥用
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-9-3 11:41:03 | 显示全部楼层
雪冬 发表于 2017-9-3 10:03
据说RTOS价格昂贵,比如VxWorks,要上数百万元。不过,要适合多种CPU,就要用高级语言编写。期待楼主更成熟 ...

搞不出来啊,原理动不懂得。 还是想学实物的东西,能代替人干活的东西
回复 支持 反对

使用道具 举报

     
发表于 2017-9-3 11:43:49 | 显示全部楼层
用汇编当然可以做RTOS,avrx就是用汇编写的。汇编的最大问题是移植性不好,所以主流的跨平台rtos的实现都是用C实现的,只有一小部分依赖平台的用汇编。现在网络这么发达,楼主可以参考ucos,freertos的实现,这些都是开源的,当然感兴趣也可以找avrx这类的参考一下任务调度,切换是如何实现的。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-9-3 11:44:10 | 显示全部楼层
Paktu 发表于 2017-9-3 11:08
还是用FreeRTOS吧,完全免费的。

感觉太复杂没打算用就是研究下玩玩,还是感觉裸机好
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-9-3 11:47:04 | 显示全部楼层
yangsen 发表于 2017-9-3 11:43
用汇编当然可以做RTOS,avrx就是用汇编写的。汇编的最大问题是移植性不好,所以主流的跨平台rtos的实现都是 ...

已经放弃了,感觉没什么用
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-9-3 11:51:07 | 显示全部楼层
la45088d1 发表于 2017-9-3 10:00
我说大哥,磨刀不误砍柴工,你先把该学的学了好吗,推荐一本书:

嘿嘿 其实ARM汇编的书还真一本没看过,看过的一本叫 汇编语言程序设计(美)布鲁姆 著,马朝晖 等译

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-9-3 17:20:43 | 显示全部楼层
la45088d1 发表于 2017-9-3 15:53
呵呵,老兄,这回你就真的太自大了。且不说为什么那么多的嵌入式操作系统面世,而且版权不菲;就是你搞一 ...

我本来就是外行啊,我专业是种地的也就会打农药,地我都种不好,我是村里出名的懒人。

村里人电脑装个系统都不相信我,尽管我都是免费帮他们。


评分

1

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2017-9-3 21:06:44 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-9-3 23:22:14 | 显示全部楼层
vonRundstedt 发表于 2017-9-3 21:06
简单的东西当然不需要RTOS,复杂的项目不上RTOS不行。比如FATFS和TCPIP协议栈里面大量delay,你要是用死循 ...

确实啊我只会写点简单小程序所以感觉没用,网络什么一点也不懂。。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 15:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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