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

 
 
> Доступ к полям структуры С из ASM, AVR studio, WinAVR
Vitёk
сообщение Mar 6 2008, 09:42
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 17-01-05
Из: Ростов-на-Дону
Пользователь №: 2 018



В основном теле программы, написанной на С, используется экземпляр структуры, примерно так:
Код
    // описание структуры
    struct TStored
    {
        ....
        volatile unsigned short var_1;
        ....
    };

    // экземпляр
    struct TStored strd;
    // ....
    strd.var_1 = 0x1234;


И есть процедура обработки прерывания, написанная на АСМе (файл типа *.s), откуда необходимо получить доступ к полю var_1 структуры strd. Я безуспешно пытался сделать это несколькими способами, насколько хватило фантазии. Сейчас пребываю в тупике.

Подскажите, можно ли это сделать, и если да, то как?


--------------------
/* Всё хорошо в меру. */
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Vitёk
сообщение Mar 6 2008, 12:02
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 17-01-05
Из: Ростов-на-Дону
Пользователь №: 2 018



Решил проблему, относительно красиво.

1. Поместил интересующие поля в самом начале структуры.
2. Окаймил описание структуры с помощью #pragma pack(push, 1) и #pragma pack(pop) (т.к. было неоднократно замечено, что поля в структуре могут физически располагаться не в том порядке, в каком они описаны):
Код
    #pragma pack(push, 1)
        struct TStored
        {
            volatile unsigned short var_1;
            volatile unsigned short second_var;
            //...... все остальные поля
        }
    #pragma pack(pop)


3. И, наконец, досткп к ним сделал следующим образом:
Код
    .extern strd;
    .equ var_1, (strd + 0)
    .equ second_var,  (strd + 2)
    //.......
    lds   r25,  var_1 + 1   // High
    lds   r24,  var_1       // Low


Работает нормально. smile.gif
Если кто найдёт недостатки данного решения, или знает, как сделать лучше - пожалуйста, не стесняйтесь, буду благодарен за советы.


--------------------
/* Всё хорошо в меру. */
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 6 2008, 22:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Vitёk @ Mar 6 2008, 16:02) *
Решил проблему, относительно красиво.
1. Поместил интересующие поля в самом начале структуры.

Честно говоря не совсем понимаю какие проблемы. Для работы на ассемблере как раз удобно использовать структуры. Я так и делаю. Дело в том, что порядок следования переменных для структур гарантирован. Что и даёт право их использовать. Ну а пользоваться лучше так, как это делает компилятор, то есть с помощью STD/LDD относительно начала

Ну например.
Код
struct                                            // Всего 40    байт (8*5) зарезарвировано и передаётся от мастера к слэйву
{                                                        // Длина структуры должна быть обязательно кратна 5 !!!!!
  uint8_t            Year;                                // Год
  uint8_t            Month;                                // Месяц
  uint8_t            Day;                                // День
  uint8_t            Hour;                                // Часы
  uint8_t            Minute;                                // Минуты
  uint8_t            Seconds;                            // Секунды
} Status;

В ассемблере
Код
EXTERN    Status

#define        Year        0                            // +0
#define        Month        1                            // +1
#define        Day        2                            // +2
#define        Hour        3                            // +3
#define        Minute        4                            // +4
#define        Seconds        5                            // +5

...
   ldi   Xl,low(Status)
   ldi   Xh,high(Status)
....

   ldd  wl,X+Minute  ; загрузить минуты
....
   std  X+Hour,wh   ; сохранить часы
....
; или так
....
   ldi   Xl,low(Status+Seconds)
   ldi   Xh,high(Status+Seconds)
   lds  wl,X+  ; загрузить секунды
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Vitёk   Доступ к полям структуры С из ASM   Mar 6 2008, 09:42
- - GDI   Как вариант попробовать разместить структуру по фи...   Mar 6 2008, 09:52
|- - Vitёk   Цитата(GDI @ Mar 6 2008, 12:52) Вы бы рас...   Mar 6 2008, 10:09
|- - zltigo   Цитата(Vitёk @ Mar 6 2008, 15:02) 2. Окай...   Mar 6 2008, 23:00
- - Vitёk   SasaVitebsk: Да, примерно так так в конце концов ...   Mar 7 2008, 08:41
|- - SasaVitebsk   Цитата(Vitёk @ Mar 7 2008, 12:41) Есть то...   Mar 7 2008, 08:56
|- - zltigo   Цитата(Vitёk @ Mar 7 2008, 11:41) Вот сам...   Mar 7 2008, 12:08
- - Vitёk   Компилятор у меня WinAVR (указано в комментарии к ...   Mar 7 2008, 09:36
- - Kirill Frolov   Цитата(Vitёk @ Mar 6 2008, 12:42) Код // ...   Mar 7 2008, 11:43
- - Vitёk   ЦитатаУ меня были проблемы с порядком размещения п...   Mar 7 2008, 12:59
|- - Kirill Frolov   Цитата(Vitёk @ Mar 7 2008, 15:59) ЦитатаН...   Mar 11 2008, 08:19
|- - mdmitry   Цитата(Kirill Frolov @ Mar 11 2008, 11:19...   Mar 11 2008, 09:20
- - umup   ЦитатаДокументацию на WinAVR в частности просто не...   Mar 11 2008, 10:27


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

 


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


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