打印
[STM8]

开始学ASM:IARSTM8汇编第二个程序(汇编调用C编译出来的汇编)

[复制链接]
3890|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32W108|  楼主 | 2011-1-23 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 STM32W108 于 2011-1-24 09:41 编辑

板子是老版的三合一实验板。

VTMR是我自己在C下写的一个简单的基于时间调度器,在C语言里面我经常使用。
现在开始学汇编,想在汇编里也使用这个调度器,
直接把C语言编译出来的代码放到汇编里面,在汇编调用。

程序用了两个VTMR,序号0,1,分别控制两个LED闪烁。

#include "proj_incs.h"
//IAR STM8寄存器使用规则:
//A,X,Y,?b0-?b7 草稿寄存器
//?b8-?b15      存储寄存器
  
#define LED_0     0              //LED_0,PD0
#define LED_1     2              //LED_1,PD2

        PUBLIC  main
        EXTERN  HS_TicksInit
        EXTERN  VTMR_Start
        EXTERN  VTMR_TicksClear
        EXTERN  VTMR_AllStop
        EXTERN  VTMR_IsExpiredAndStop

        SECTION `.near_func.text`:CODE:NOROOT(0)
main:
//------------------------------------------------------------------------------
//时钟初始化
        CLR       A         
        LD        CLK_CKDIVR, A    // 主时钟 = 16MHZ

//------------------------------------------------------------------------------
//IO口初始化
        LD        A, #(1<<LED_0)|(1<<LED_1)       //LED_0,LED_1设置成推挽输出
        LD        PD_DDR, A            
        LD        PD_CR1, A                       
        CLR       A
        LD        PD_CR2, A
         
//------------------------------------------------------------------------------
//VTMR初始化        
        CALL      VTMR_AllStop      //所有VTMR停止
        CALL      HS_TicksInit      //节拍初始化

//------------------------------------------------------------------------------
//打开全局中断
        RIM                         //打开全局中断
   
//------------------------------------------------------------------------------
//启动VTMR0,VTMR1
        LDW       X, #500           //启动VTMR0,500ms
        LD        A,#0              //VTMR0
        CALL      VTMR_Start      
                 
        LDW       X, #250           //启动VTMR1,250ms
        LD        A,#1              //VTMR1
        CALL      VTMR_Start      

//------------------------------------------------------------------------------
//主循环
main_loop:
   
//------------------------------------------------------------------------------
//VTMR0调度
proc_vtmr_0:
        LD        A,#0                    //VTMR0
        CALL      VTMR_IsExpiredAndStop
        TNZ       A
        JREQ      proc_vtmr_0_end         //如果VTMR0时间未到,跳转到 proc_vtmr_0_end
        //----------------------------------------------------------------------
        //VTMR0时间到,执行开始
        BTJT      PD_ODR, #LED_0 ,led_0_clr   //如果LED_0为1,跳转到 led_0_clr   
led_0_set:
        BSET      PD_ODR, #LED_0              //置位LED_0
        JRA       proc_vtmr_0_restart
led_0_clr:
        BRES      PD_ODR, #LED_0              //清位LED_0

proc_vtmr_0_restart:
        LDW       X, #500                  //重新启动VTMR0,500ms
        LD        A,#0                     //VTMR0
        CALL      VTMR_Start  
        //----------------------------------------------------------------------
        //VTMR0时间到,执行结束
proc_vtmr_0_end:


//------------------------------------------------------------------------------
//VTMR1调度
proc_vtmr_1:
        LD        A,#1                        //VTMR1
        CALL      VTMR_IsExpiredAndStop
        TNZ       A
        JREQ      proc_vtmr_1_end            //如果VTMR0时间未到,跳转到 proc_vtmr_1_end
         
        //----------------------------------------------------------------------
        //VTMR1时间到,执行开始
        BTJT      PD_ODR, #LED_1 ,led_1_clr  //如果LED_1为1,跳转到 led_1_clr   
led_1_set:
        BSET      PD_ODR, #LED_1             //置位LED_1
        JRA       proc_vtmr_1_restart
led_1_clr:
        BRES      PD_ODR, #LED_1             //清位LED_1

proc_vtmr_1_restart:
        LDW       X, #250                    //重新启动VTMR1,250ms
        LD        A, #1                      //VTMR1
        CALL      VTMR_Start  
        //----------------------------------------------------------------------
        //VTMR0时间到,执行结束
proc_vtmr_1_end:

//------------------------------------------------------------------------------
//主循环
        JRA       main_loop   
         
        END

stm8_asm_01.rar

57.54 KB

沙发
sdpz| | 2011-1-24 09:33 | 只看该作者
擦。。。这叫调用C吗?IAR汇编本来就能调用C模块里的函数。
要是像你那样做,我宁愿直接写汇编。STM8的指令很好用,写起来感觉和C很相似。
不过宏定义、变量初始化之类的,汇编总没C的方便。所以我现在只用C调用汇编。
还有我碰上一件纠结的事情,就是用C调用汇编写的函数,执行速度竟然比我全部用汇编写的速度要快。我已经做了无数次的优化了。。。无限纠结。。。我一直都认为IAR4STM8的C编译器是很**肋的,我错了,我终于错了。。。

使用特权

评论回复
板凳
STM32W108|  楼主 | 2011-1-24 09:42 | 只看该作者
为不引起误会,标题已经更改。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://www.rf-module-china.com stm32w108@126.com  深圳华奥通公司招聘开单片机射频开发工程师 https://bbs.21ic.com/icview-210623-1-1.html

0

主题

89

帖子

1

粉丝