|
|
  |
Как проект в WinAVR переделать под CodeVision? |
|
|
|
Jul 6 2006, 18:16
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Код // macro to enter a stack with gcc Вот такая строка есть в одном файле. Дает понять что программа заточена не только под специфичные для каждого компилятора хидеры, но и под сам компилятор...
|
|
|
|
|
Jul 6 2006, 18:33
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 6 2006, 19:11
|
Частый гость
 
Группа: Свой
Сообщений: 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?
|
|
|
|
|
Jul 6 2006, 19:26
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Цитата включать надо заголовочник glcd.h - это объявление асмовских функций в С коде. Кстати совершенно стандартный прием.
Оставьте пустой main, вставьте в проект асм файлы и собирайте. Более или менее разобрался с заголовочником. А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы.
|
|
|
|
|
Jul 6 2006, 20:05
|

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

|
Цитата // macro to enter a stack with gcc Набор всяких полезных макросов, пока можно закоментить, а потом разбираться, где и как используються и как это можно обойти. Цитата Как вышеприведенное выражение должно писаться в Codevision? Возможно проблема в битовых полях(попробуйте локализовать), включить их поддержку в CV. Цитата А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы. Если нельзя, вероятно стоит забыть про CV, ибо что это за среда, если не позволяет работать со смешанным кодом. Попробуйте спросить у клетчатого, он большой спец по CV.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 6 2006, 20:48
|
Знающий
   
Группа: Свой
Сообщений: 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 можно свободно мешать ассемблер с сишным кодом.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Jul 7 2006, 01:27
|
Участник

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

|
Цитата(virtuality @ Jul 6 2006, 22:26)  А простите, как добавить асмовские файлы в проект? через интерфейс редактора можно добавить только сишные файлы. Попробуйте так: #asm .include "file.asm" #endasm
|
|
|
|
|
Jul 7 2006, 16:30
|
Частый гость
 
Группа: Свой
Сообщений: 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 находятся в приаттаченом в анчале темы архиве. Что делать и кто виноват?
|
|
|
|
|
Jul 7 2006, 18:16
|

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

|
Цитата В строке 1257 : syntax error unexpect "(" Похоже не понимает hi8()/lo8(). Замените на стандартный ассемблер AVR или напишите эти макросы. Цитата но при компляции ругается на invalid directive .section, .global Да это специфично.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|