| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 985 人关注过本帖
标题:那个,好久不见了,大家
只看楼主 加入收藏
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:6 
那个,好久不见了,大家
自己弄的avr-8最简单任务切换,ABI看的avr-gcc.原理很简单,就是切下任务栈,linux里只有avr-32.(avr指令实在是不好弄,高手莫笑,谢谢)全局变量都在符号表里了,task_entries啥的,就是TCB啦,同事欢喜叫这个名字,么办法。
程序代码:
/******************************************/
/*******create by zaixuexi 2011 11 14******/
/******************************************/
#include <target/config.h>
#include "macros.inc"
#include <asm/asm-offsets.h>

    .global    __arch_hw_switch_to
    .func    __arch_hw_switch_to
__arch_hw_switch_to:
    mov  r20, r24                 ;last = prev
    push r1
    push r0
    in   r0, _SFR_IO_ADDR(SREG)
    push r0                       ;*sp-- = SREG
    push r29
    push r28
    push r17
    push r16
    push r15
    push r14
    push r13
    push r12
    push r11
    push r10
    push r9
    push r8
    push r7
    push r6
    push r5
    push r4
    push r3
    push r2                       ;*sp-- = r2
    lds  r1,  g_task_entries+1    ;r1 = HIBYTE(&task_entries)
    lds  r0,  g_task_entries      ;r0 = LOBYTE(&task_entries)
    movw r30, r0                  ;z = &task_entries
    ldi  r25, TASK_ENTRY_SIZE
    mul  r25, r24                 ;prev*sizeof(struct task_entry)
    add  r30, r0
    adc  r31, r1                  ;z = &task_entries[prev]
    adiw r30, TASK_ENTRY_SP       ;z = &(task_entries[prev].sp)
    in   r1,  _SFR_IO_ADDR(SPH)
    in   r0,  _SFR_IO_ADDR(SPL)
    std  z+1, r1
    st   z,   r0
    sts  task_current, r22        ;task_current = next
    lds  r1,  g_task_entries+1
    lds  r0,  g_task_entries
    movw r30, r0
    ldi  r23, TASK_ENTRY_SIZE
    mul  r23, r22
    add  r30, r0
    adc  r31, r1
    adiw r30, TASK_ENTRY_SP
    ldd  r1,  z+1
    ld   r0,  z
    out  _SFR_IO_ADDR(SPH), r1
    out  _SFR_IO_ADDR(SPL), r0    ;sp = task_entries[next].sp
    pop  r2                       ;r2 = *(sp++)
    pop  r3
    pop  r4
    pop  r5
    pop  r6
    pop  r7
    pop  r8
    pop  r9
    pop  r10
    pop  r11
    pop  r12
    pop  r13
    pop  r14
    pop  r15
    pop  r16
    pop  r17
    pop  r28
    pop  r29
    pop  r0
    out  _SFR_IO_ADDR(SREG), r0    ;SREG = *(sp++)
    pop  r0
    pop  r1
    ret                            ;PC = *(sp++)
    .endfunc

    .global    __arch_hw_init_task
    .func    __arch_hw_init_task
__arch_hw_init_task:
    push r29
    push r28
    push r17
    push r16
    push r15
    push r14
    push r13
    push r12
    push r11
    push r10
    push r9
    push r8
    push r7
    push r6
    push r5
    push r4
    push r3
    push r2
    push r1
    push r0
    lds  r1,  g_task_entries+1
    lds  r0,  g_task_entries
    movw r30, r0
    ldi  r25, TASK_ENTRY_SIZE   
    mul  r25, r24              ;pid*sizeof(struct task_entry)
    add  r30, r0
    adc  r31, r1
    adiw r30, TASK_ENTRY_SP    ;z = &(task_entries[pid].sp)
    ldd  r1,  z+1
    ld   r0,  z                ;z = task_entries[pid].sp
    movw r30, r0
    st   z,   r21
    st   -z,  r20              ;*z-- = priv           
    sbiw r30, 1
    st   z,   r22
    st   -z,  r23              ;*z-- = call
    sbiw r30, 1
    ldi  r19, 0x80             ;0x80 (Interrupt Enable)
    st   z,   r19           
    sbiw r30, 1                ;*z-- = 0x80;
    ldi  r19, 0x14             ;r0~r17,r28,r29
    eor  r0,  r0
__save_reg:   
    st   z,   r0
    sbiw r30, 1
    subi r19, 1
    cpi  r19, 0
    BRNE __save_reg            ;*z-- = 0
    movw r18, r30              ;sp
    lds  r1,  g_task_entries+1
    lds  r0,  g_task_entries
    movw r30, r0
    ldi  r25, TASK_ENTRY_SIZE   
    mul  r25, r24
    add  r30, r0
    adc  r31, r1
    adiw r30, TASK_ENTRY_SP
    movw r0,  r18
    std  z+1, r1
    st   z,   r0
    pop  r0
    pop  r1
    pop  r2
    pop  r3
    pop  r4
    pop  r5
    pop  r6
    pop  r7
    pop  r8
    pop  r9
    pop  r10
    pop  r11
    pop  r12
    pop  r13
    pop  r14
    pop  r15
    pop  r16
    pop  r17
    pop  r28
    pop  r29
    ret
    .endfunc
搜索更多相关主题的帖子: include create target linux 好久不见 
2011-11-14 11:15
chenwei435
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:322
专家分:1611
注 册:2010-11-28
收藏
得分:20 
拿分
2011-11-14 12:17
李尸尸
Rank: 2
等 级:论坛游民
威 望:1
帖 子:30
专家分:77
注 册:2011-11-7
收藏
得分:20 
好长 新手膜拜
2011-11-14 23:50
insok
Rank: 2
来 自:江苏常州
等 级:论坛游民
帖 子:32
专家分:63
注 册:2011-10-29
收藏
得分:20 
看标题。。。看内容。。。看代码。。。反正就是全部都看了,可是就是不懂它是用来干啥么的。。唉,我实在是太弱智了。

我什么都不懂……额。丢人啊。
2011-11-15 14:19
zxdg888
Rank: 2
等 级:论坛游民
帖 子:55
专家分:21
注 册:2011-8-15
收藏
得分:20 
...
2011-11-15 20:18
zxdg888
Rank: 2
等 级:论坛游民
帖 子:55
专家分:21
注 册:2011-8-15
收藏
得分:0 
先下下来看着。。。  嘿嘿
2011-11-15 20:18
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
分给我点。。
2011-11-15 22:30
快速回复:那个,好久不见了,大家
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032983 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved