[STM32F0] 手打个简单任务调度用来学UCOS内核原理

[复制链接]
1821|4
 楼主| yjmwxwx 发表于 2017-9-3 09:59 | 显示全部楼层 |阅读模式
本帖最后由 yjmwxwx 于 2017-9-3 10:08 编辑

大神们的教程要钱买不起,自己看了看书看的有点蒙。
干脆直接动手胡乱写个程序,第一次写这样程序也是写了个马马虎虎。

UOCS通过优先级查就绪表,我写的直接查就绪表找待运行的函数,实验啦没几个任务搞那么麻烦干啥。
控制块就俩参数,一个栈顶一个延时,写了一个空闲任务一个任务1,通过中断用堆栈切换,空闲任务保持一直就绪。 0x20000700任务1执行次数,0x20000704空闲任务执行次数。
高亮显示的是两任务分别运行的次数
截图_2017-09-02_22-55-22.png
osshiyan.zip (10.74 KB, 下载次数: 3)
STM32F030F4P6下的程序

  1. [url=home.php?mod=space&uid=72445]@[/url] stm32f030f4p6 asm
  2. [url=home.php?mod=space&uid=72445]@[/url] 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                        @ 返回




  
liyikuan 发表于 2017-9-3 10:59 来自手机 | 显示全部楼层
感觉没啥用,就是全局变量,和延时。占内存。
 楼主| yjmwxwx 发表于 2017-9-3 11:27 | 显示全部楼层
liyikuan 发表于 2017-9-3 10:59
感觉没啥用,就是全局变量,和延时。占内存。

确实没用,胡乱玩玩
mmbs 发表于 2017-9-3 22:16 | 显示全部楼层
汇编一脸懵逼。
xiaohua880123 发表于 2017-9-4 11:40 | 显示全部楼层
楼主告诉我们要想工资高,还得写汇编,上级要求交出来都没问题,别人也看不懂,所以汇编才是体现自己的价值啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

124

主题

3011

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部