реклама на сайте
подробности

 
 
> программа на ассемблере
dimka76
сообщение Jun 4 2008, 11:23
Сообщение #1


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Добрового времени суток :-)

Хочу написать на ассемблере программку и что-бы она размещалась во внутренней SRAM.
Достаточно ли для этого в начале программы прописать .ORG <адресс SRAM> (естественно после всего того что нужно прописать в стартапе) ?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dimka76
сообщение Jun 7 2008, 11:53
Сообщение #2


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



спасибо сергею за подсказки

у меня что-то получилось, по крайней мере работает.
привожу код который у меня получился

в проекте три файла
1. main.c

Код
#include <iolpc2103.h>

typedef unsigned int  UINT;
typedef unsigned short  USHORT;
typedef unsigned char UCHAR;

extern __ramfunc void __haffman(USHORT*  pHaff, USHORT* pHaffLen);

USHORT haffman[256] =
{
  0    ,    //0
2    ,    //1
6    ,    //2
...
32766    ,    //254
32767        //255

};

USHORT haffman_len_mask[256] =
{
0x0001    ,    //0
0x0002    ,    //1
...
0x4000        //255
};

USHORT* pHaff = haffman;
USHORT* pHaffMask = haffman_len_mask;

extern void _cpy(void);

void main()
{

  _cpy();
   __haffman(pHaff, pHaffMask);
  
  while(1){}
}


второй сама функция, которая должна выполняться в ОЗУ
2 haff.s79
Код
       MODULE    ?HAFFMAN
      
       RSEG     RAM_FUNC : CODE
        
       PUBLIC  __haffman        
       CODE32
      
       DC32  SFB(RAM_FUNC)
       DC32  SIZEOF(RAM_FUNC)      
        
__haffman:  
     //в R0 указатель на первый входной параметр функции
     // в данном случае указатель на таблицу констант хаффмана
    
     // в R1 указатель на второй входной параметр функции    
     // в данном случае указатель на таблицу длинн констант хаффмана
    
      mov   R2, #35       // data in  
      
      mov   R3,#0x01      // bit position
      
      mov   R10,#0x40000000  // адресс выходных данных
      orr   R10,R10,#0x1000
      mov   R11,#0
      str   R11,[R10]  
      
      mov   R11,#0xFF
      orr   R11,R11,R11, LSL #8  //R11 <- 0x0000FFFF      
      
repeat:  
      ldr  R4,[R0,R2, LSL #1]  //загрузить в R4 код HAFFMAN соответствующий входным данным
      
      orr   R4,R4,R5,LSL #8
      
      and   R4,R4,R11           // маскирование старших 16 бит
      
      mul  R5,R4,R3          // сдвигаем очередной код на текущую позицию
      
      ldr   R9,[R10]     // загружаем выходные данные из текущей позиции
      
      orr   R5,R5,R9    // добавляем новые данные
      
      str   R5,[R0]       // сохраняем новые данные
            
      cmp   R6,#0
      addne R0,R0,#4  
      
      ldr   R7,[R8,R2, LSL #1] //загрузить в R7 длину кода HAFFMAN соответствующий входным данным      
      
      LSL   R7,R7,#1
      
      muls  R5,R3,R7
      
      movcs R3, #0x01
      movcc R3,R5
      
      addcs R0,R0,#8
      
      b     repeat
      
      mov   PC,LR    //возврат из подпрограммы R15 (PC)- программный счетчих,
                        // R14 (LR) - регистр связи в нем автоматически сохраняется
                        // адрес возврата из подпрограммы  
      
      ENDMOD      
      END


и третий файл функция копирования из FLASH в ОЗУ

3 copyd_.s79
Код
      MODULE    ?CPY
      RSEG    CODE_ID : CODE
      PUBLIC    _cpy
      EXTERN    COPYD      
      CODE32
      
_cpy:  
       ldr     R0,COPYD        
       add     R5,R0,#4      
       ldr     R1,[R5],#+4        
       ldr     R2,[R5]
       sub     R2,R2,#1
       add     R0,R0,#4
      
_cpy_1:  ldrb    R12,[R0],#+1
         subs    R2,R2,#1
         strb    R12,[R1],#+1
         bne    _cpy_1
        
         mov   PC,LR          

      ENDMOD  
      
      MODULE    ?FLASH
      RSEG    FLASH :CODE      
      PUBLIC    COPYD        
      CODE32
      
COPYD:       DC32 SFB(FLASH)

      LTORG
      ENDMOD //?FLASH      
      END


и еще подправил файл ххх.XCL
в нем убрал
Код
-QCODE_I=CODE_ID

и добавил
Код
-Z(CODE)RAM_FUNC=40000000-40002000
-Z(CODE)FLASH=40-7FFF

-QRAM_FUNC=FLASH


может получилось несколько коряво, но симуляция показывает, что принцип работает.
сама функция
Код
void __haffman(USHORT*  pHaff, USHORT* pHaffLen);
сырая. я над ней еще работаю поэтому прошу не обращать особого внимания на ее тело

а весь проект целиком в прикрепленном файле

идея реализации алгоритма Хаффмана взята в подфоруме AVR (необычное использование аппаратного умножителя)
Прикрепленные файлы
Прикрепленный файл  haffman.rar ( 36.67 килобайт ) Кол-во скачиваний: 31
 


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 07:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016