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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Как проект в WinAVR переделать под CodeVision?
virtuality
сообщение Jul 6 2006, 18:16
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Код
// macro to enter a stack with gcc


Вот такая строка есть в одном файле. Дает понять что программа заточена не только под специфичные для каждого компилятора хидеры, но и под сам компилятор...
Go to the top of the page
 
+Quote Post
virtuality
сообщение Jul 6 2006, 18:33
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Начинаю ковырять.

Выяснил - вот это приводило к появлению ошибки "the program hs no void main() function"

Код
// macro to utilize lpm with inc

.macro  rpm     reg
#if defined  (__AVR_ENHANCED__)
        lpm     \reg, Z+
#else
        lpm
        mov     \reg, r0
        adiw    ZL, 1
#endif
.endm

// macro to enter a stack with gcc

.macro ENTER unused_regs stack_locals

ENTER:
        clr     XH
        ldi     XL, \stack_locals
        ldi     ZH, hi8(ENTRY)      // there is no way to rescale an address by 0.5
        ldi     ZL, lo8(ENTRY)      // thus we have to right shift the address with additional code
        lsr     ZH
        ror     ZL
        xjmp    (__prologue_saves__ + 2 * \unused_regs)
ENTRY:
.endm


// macro to leave a stack entered with ENTER

.macro LEAVE unused_regs stack_locals ptr_changed

LEAVE:
        ldi     ZL, 18 - \unused_regs
        .if (\ptr_changed)
           in      YL, _SFR_IO_ADDR(SPL)
           in      YH, _SFR_IO_ADDR(SPH)
        .endif
        .if (\stack_locals)
           adiw    YL, \stack_locals
        .endif
        xjmp    (__epilogue_restores__ + 2 * (\unused_regs))
.endm


// macro unsigned 8x8 multiplication

.macro  MUL8x8  resH resL A B temp
        clr        \resH
        ldi     \temp, 8
        lsr        \A
        brcc    .+2
        add     \resH, \B
        ror     \resH
        ror     \resL
        dec     \temp
        brne    .-14
.endm


// movw replacement, support words on odd addresses, overlapping, hardware dependend
// and avoid dummy moves on same registers, to get this macro working we have to reassign
// register defines, such as above

.macro  _movw dst src
    .if (\src - \dst)
        .if ((\src | \dst) & 0x01)
            .if ((\src - \dst) & 0x80)
                mov     \dst +1, \src +1
                mov     \dst   , \src
            .else
                mov     \dst   , \src
                mov     \dst +1, \src +1
            .endif
        .else
#if __AVR_ENHANCED__
                movw    \dst   , \src
#else
                mov     \dst   , \src
                mov     \dst +1, \src +1
#endif
        .endif
    .endif
.endm


Что это, чем чревато удаление этого и если чревато плохими последствиями, как это сделать в CodeVision?

P.S. этот код располагался в конце файла regs.inc
Go to the top of the page
 
+Quote Post
virtuality
сообщение Jul 6 2006, 19:11
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Код
typedef union {
    uint8_t All;
    struct {
    uint8_t AutoLineFeed:1,    
        FixedFont:1,
        Clipping:1;              
    };
} glcdFlags_t;


declaration syntax error.

Как вышеприведенное выражение должно писаться в Codevision?
Go to the top of the page
 
+Quote Post
virtuality
сообщение Jul 6 2006, 19:26
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Цитата
включать надо заголовочник glcd.h - это объявление асмовских функций в С коде. Кстати совершенно стандартный прием.

Оставьте пустой main, вставьте в проект асм файлы и собирайте.



Более или менее разобрался с заголовочником. А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 6 2006, 20:05
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
// macro to enter a stack with gcc

Набор всяких полезных макросов, пока можно закоментить, а потом разбираться, где и как используються и как это можно обойти.
Цитата
Как вышеприведенное выражение должно писаться в Codevision?

Возможно проблема в битовых полях(попробуйте локализовать), включить их поддержку в CV.
Цитата
А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы.

Если нельзя, вероятно стоит забыть про CV, ибо что это за среда, если не позволяет работать со смешанным кодом.
Попробуйте спросить у клетчатого, он большой спец по CV.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
virtuality
сообщение Jul 6 2006, 20:18
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Кто такой клетчатый? Киньте пожалуйста ссылочку на его профиль, поиск в форуме имен начинающихся с "клетчат" результатов не дал.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 6 2006, 20:31
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Наш общий друг [banned]123.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 6 2006, 20:48
Сообщение #23


Знающий
****

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



Цитата(virtuality @ Jul 6 2006, 23:11) *
Код
typedef union {
    uint8_t All;
    struct {
    uint8_t AutoLineFeed:1,    
        FixedFont:1,
        Clipping:1;              
    };
} glcdFlags_t;


declaration syntax error.

Как вышеприведенное выражение должно писаться в Codevision?


Код
typedef union {
    uint8_t All;
    struct {
    uint8_t AutoLineFeed:1,    
        FixedFont:1,
        Clipping:1;              
    } s;
} glcdFlags_t;


потому что CV не позволяет делать безымянных полей.

Ассемблерные файлы не добавляются, у CV другая организация проекта.
Впрочем, в CV можно свободно мешать ассемблер с сишным кодом.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
tiasur
сообщение Jul 7 2006, 01:27
Сообщение #24


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 24-05-06
Пользователь №: 17 392



Цитата(virtuality @ Jul 6 2006, 22:26) *
А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы.


Попробуйте так:

#asm
.include "file.asm"
#endasm
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 7 2006, 07:50
Сообщение #25


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(virtuality @ Jul 6 2006, 23:18) *
Кто такой клетчатый? Киньте пожалуйста ссылочку на его профиль, поиск в форуме имен начинающихся с "клетчат" результатов не дал.

Не берите дурного в голову wink.gif
Клетчатый Вам не только не поможет, а и вовсе заведёт в болото своего больного подсознания.
Go to the top of the page
 
+Quote Post
virtuality
сообщение Jul 7 2006, 16:30
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Итак, поехали ковырять.

Вот что у меня получилось с первой функцией:

файл s65.c - главный
Код
#define __AVR_ATmega16__

#include <mega16.h>
#include <stdio.h>
#include <glcd.h>



void main ()

{
glcdWait(500);
}



Фрагмент файла glcd.h
Код
extern void glcdWait(uint16_t ms)
{
#asm
glcdWait:
        sbiw    P0, 1                                   // 2
        brcc    glcdWait1                               // 2
        ret                                             // 2 -2 = 0 for no branch in both loops
glcdWait1:
        nop
        ldi     T0, lo8(DELAY_ONE_MILLISECOND -4)       // 1
        ldi     T1, hi8(DELAY_ONE_MILLISECOND -4)       // 1
glcdWait2:
        sbiw    T0, 1                                   // 2
        brne    glcdWait2                               // 2 = 4, = 3 for last loop
        rjmp    glcdWait                                // 2 = 8

#endasm
}


Как выгялдел этот фрагмент в glcd_init.asm:

[code]

// void glcdWait(uint16_t ms);          
// wait some milliseconds, XTAL must be correct defined

        .global glcdWait                // used T0,T1 stack 0
glcdWait:
        sbiw    P0, 1                                   // 2
        brcc    glcdWait1                               // 2
        ret                                             // 2 -2 = 0 for no branch in both loops
glcdWait1:
        nop
        ldi     T0, lo8(DELAY_ONE_MILLISECOND -4)       // 1
        ldi     T1, hi8(DELAY_ONE_MILLISECOND -4)       // 1
glcdWait2:
        sbiw    T0, 1                                   // 2
        brne    glcdWait2                               // 2 = 4, = 3 for last loop
        rjmp    glcdWait                                // 2 = 8


;************************************************



Запускаем - на программу С компилятор не ругается, однако пишет ошибку при ассемблировании - выдает ассмблированную программу:

Код
;     176         ret                                             // 2 -2 = 0 for no branch in both loops
        ret                                             // 2 -2 = 0 for no branch in both loops
;     177 glcdWait1:
glcdWait1:
;     178         nop
        nop
;     179         ldi     T0, lo8(DELAY_ONE_MILLISECOND -4)       // 1
        ldi     T0, lo8(DELAY_ONE_MILLISECOND -4)       // 1       // ------СТРОКА 1257----
;     180         ldi     T1, hi8(DELAY_ONE_MILLISECOND -4)       // 1
        ldi     T1, hi8(DELAY_ONE_MILLISECOND -4)       // 1


В строке 1257 : syntax error unexpect "("


файлы glcd.inc и regs.inc находятся в приаттаченом в анчале темы архиве.

Что делать и кто виноват?
Go to the top of the page
 
+Quote Post
virtuality
сообщение Jul 7 2006, 17:29
Сообщение #27


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Так разобрался я как включать асмы в проект, но при компляции ругается на invalid directive .section, .global

Это тоже специфика WinAVR?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 7 2006, 18:16
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
В строке 1257 : syntax error unexpect "("

Похоже не понимает hi8()/lo8(). Замените на стандартный ассемблер AVR или напишите эти макросы.
Цитата
но при компляции ругается на invalid directive .section, .global

Да это специфично.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
virtuality
сообщение Jul 7 2006, 18:28
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



оххх...

Наивный вопрос, но нельзя ли как-нить в WinAVR скомпилить унифицированную библиотеку, чтобы можно было использовать с CodeVision?
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 7 2006, 21:55
Сообщение #30


Знающий
****

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



Нет. CV работает только с исходниками.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


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


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