找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6055|回复: 6
打印 上一主题 下一主题
收起左侧

RTX51-Tiny的学习

  [复制链接]
跳转到指定楼层
楼主
ID:91442 发表于 2015-10-29 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                                                                                                 这两天在考虑多路继电器同时工作的情况,开始接触了51系统中的RTOS。目前看到较多的是Keil 提供的 RTX51 Tiny(免费版),另外的有周立功公司的 Small RTOS51,对于更大的系统,就只有考虑uCOS了。从STC15F204EA的硬件配置来看,目前只适合使用RTX51 Tiny了。

在学习过程中,有下面的疑问需要逐一验证:

在标准的时间片轮换模式下,疑问:
    1. os_create_task(nTask_Id) 可以在任何时间调用?
    2. os_create_task() 和 os_set_ready() 的区别?如何只创建一个任务而不启动?当一个任务处于ready时,在下一个时间片就会启动工作?
    3. 可以通过 os_set_ready(nTask_Id) 和 os_send_signal(nTask_id) 启动一个任务?
    4. os_delete_task(nTask_id)的任务是否可以再次激活?
    5. 任务数量的多少是否会影响到程序的执行速度?如果系统中一开始有12个任务在运行,后面删除到只剩下4个,这时候
       任务的运行速度是否提高了4倍?
    6. 在问题5的情况下,如何保证基本驱动程序能够按照稳定的时间间隔运行?
        A: 在系统初始化完成后,不要增加,删除或挂起任务,这样就可以保证时间片轮换的频率稳定。(这个做法是否正确???)   
    7. 如何测试系统当前的负载量和运行速度?
    8. 在系统中还有其他需要用到定时的中断时,如何平衡时间的分配?如系统中有串行口通讯,或者更高精度的定时器(定时精度高于SysTick)?
    9. 对于在单个任务中使用多重循环进行延时,如何保证延时时间的准确性?(函数的重入问题)假设系统中的每个时间片为50ms,同时有10个任务
       在运行,如何保证其中的任务1能够连续不断的输出频率为1KHz的方波(端口的翻转频率为2KHz)?同时任务2连续输出频率200Hz的方波?按照正常
       理解,系统中有10个并行任务,则每个任务的工作周期是 SysTickPeriod * nTaskCount = 50ms*10 = 500ms,其中任务1只有其中的50ms内能够
       对某个GPIO进行控制,使其做2KHz的翻转(使用循环延时即可)。但是在其它任务激活的时候,该如何进行?
    10.对于来自外部的中断,如触发信号输入(串口中断发生),此时处理串口工作的任务处于休眠期,是否可以通过串口中断立即激活该任务?
       例如使用 os_switch_task()。但是如何能够避开其它任务,而直接执行串口工作处理的任务呢? 是否需要启动优先级的任务?   


另外,通过实际测试,对SysTick的配置做了确认。 这个可以在 conf_tny.A51中做配置。说明如下:
1. INT_CLOCK EQU      24000         ; 系统时钟设置为 24.000MHz时,每个 SysTick 周期是1ms。   
2. TIMESHARING EQU     1             ; 每个任务的时间片的长度,用SysTick的个数表示。
在以上配置下,每个任务的时间片长度为:FOSC/INT_CLOCK*TIMESHARING =  24.000M/24000*1 = 1ms。
另外,为了发挥 STC15系列1T单片机的优势,在HW_TIMER的初始化阶段,设置辅助寄存器 AUXR,使Timer0工作于1T定时器模式。否则默认的工作在 12T传统的8051定时器模式。

具体修改的程序段如下:
HW_TIMER: HW_TIMER_CODE
TIMERINT:
IF (LONG_USR_INTR)
  PUSH ACC
  MOV A,PSW
  ANL A,#018H
  XRL A,#?RTX_REGISTERBANK
  JNZ CONT_TIMINT
; avoid recursive timer interrupt
  POP ACC
  RETI  ; Return from Recursive Timer Interrupt
CONT_TIMINT:    POP ACC
ENDIF
  CALL HW_TIMER ; Enable Interrupts again.
  MOV ?RTX_SAVEPSW,PSW
  MOV PSW,#?RTX_REGISTERBANK
  MOV saveacc,ACC     ; ACC required by some Cygnal devices
; Update 8051 Interrupt Timer
  CLR TR0
;****************************************************************
; 下面一行语句专门为 STC15系列单片机添加,用于1T模式计时器设置。

  ORL AUXR, #80H       ;对于 STC15 系列产品,使用1T时钟模式,新增加的语句。
;****************************************************************      
  MOV A,TL0
  ADD A,#LOW (?RTX_CLOCK + 7)
  MOV TL0,A
  MOV A,TH0
  ADDC A,#HIGH (?RTX_CLOCK + 7)
  MOV TH0,A
  SETB TR0
至此, Timer0的配置完成,就等待系统启动任务循环了。

总之,希望在了解了以上问题以后,就能够自如的使用这个mini的RTOS了。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:130786 发表于 2016-11-1 15:00 | 只看该作者
能不能完全的移植出来呢。。
回复

使用道具 举报

板凳
ID:495165 发表于 2019-6-19 16:13 | 只看该作者
hello 不知道楼主总结的这些问题有结果了吗
回复

使用道具 举报

地板
ID:745758 发表于 2020-5-17 00:25 来自手机 | 只看该作者
我也按这种设置过,但是时钟总是不对,只创建了task_1,内部有LED翻转,然后来一个wait(ktmo,1000),按理说应该是1秒延时翻转,但是实际上是0.3秒,想不通
回复

使用道具 举报

5#
ID:117433 发表于 2020-6-2 11:19 | 只看该作者
sandgod 发表于 2020-5-17 00:25
我也按这种设置过,但是时钟总是不对,只创建了task_1,内部有LED翻转,然后来一个wait(ktmo,1000),按理说 ...

我试过用STC官方的库,时钟好像没问题
回复

使用道具 举报

6#
ID:76719 发表于 2020-7-9 09:26 | 只看该作者
你把SYSTICK周期设置高一点,设置成10MS试试
回复

使用道具 举报

7#
ID:514317 发表于 2022-3-23 11:39 | 只看该作者
zzw15951929946 发表于 2020-7-9 09:26
你把SYSTICK周期设置高一点,设置成10MS试试

有没有发现    其他任务都没多大问题   如果有外部中断的情况下    整个系统的时间片就会有问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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