Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: работа с EEPROM в KEIL  (Прочитано 15251 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Yura
Гость
« : 20-04-2004 05:07 » 

В моём программаторе память программ и EEPROM пишется отдельно (разные файлы), поэтому мне нужно иметь доступ по абсолютным адресам, а с этим почемуто возникают проблемы.
Я хочу пока организовать доступ к EEPROM через процедуру на ASM
без использования xbanking.a51 чтобы луше понимать что происходит, но KEIL 2.38 (с51 7.06)похоже только в теории поддерживает ассемблерные вставки, а на практике при установлении флажка генерации SRC-файла(требуется для создания вситавок) выдаётся куча угрожающих предупреждений или ошибок. Причём как с обычным так и с расширеным линкером/ассемблером.
Пожайлуста, помогите разобраться.
Записан
NeilPryde
Гость
« Ответ #1 : 20-04-2004 07:04 » 

В документации написано, что компилятор не генерит одновременно и .src файл и .obj. Для того чтобы получился .obj, нужно .src-файл пропустить через ассемблер. После чего  попробовать собрать весть проект целиком. Должно получится.
А вообще asm в программе на с, не есть хорошо. Лучше без него программу переписать.
Записан
Yura
Гость
« Ответ #2 : 20-04-2004 21:43 » 

Цитата

А вообще asm в программе на с, не есть хорошо. Лучше без него программу переписать.

Полностью согласен.
Цитата

В документации написано, что компилятор не генерит одновременно и .src файл и .obj. Для того чтобы получился .obj, нужно .src-файл пропустить через ассемблер. После чего попробовать собрать весть проект целиком. Должно получится.

Я так и не нашёл в доке как отключить генерацию OBJ-файла. nooj вроде не для этого и точно это не делает. SRC файл у меня создаётся без проблем когда я меняю флаг на генерацию файла .LIB вместо executable только проблема на этом не исчезает. При попытки линковки OBJ файла созданного из
SRC файла выскакивает куча вот таких предупреждений:
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  ?C?SCDIV
    MODULE:  dbg2.obj (DBG)
И HEX файл не создаётся.
Если у кого нибудь есть пример работы с ассемблерными вставками то большая просьба мне их прислать.(желательно для AT89S8252)
Записан
NeilPryde
Гость
« Ответ #3 : 21-04-2004 06:26 » 

Цитата

Я так и не нашёл в доке как отключить генерацию OBJ-файла.

Генерация .obj- файла отключается прагмой SRC. Кстати, наряду с asm, endasm есть еще asmexpand, noasmexpand, может быть они вам пригодятся.

Вот немного измененный файл hello.c из комплекта примеров, с моей вставкой ассемблерного блока.

Код:

#pragma SRC          /*просим компилятор создать для этого модуля .src файл, а не .obj*/
#pragma DEBUG CODE   /* pragma lines can contain C251 command    */
                     /* line directives                          */
 
#include <reg251s.h> /* special function register declarations   */
                     /* for the intended 80251 derivative        */

#include <stdio.h>   /* prototype declarations for I/O functions */


/****************/
/* main program */
/****************/
void main )void:  
|                   /* execution starts here after stack init   */

#ifndef MCB251
  SCON = 0x50;      /* SCON{mode 1, 8-bit UART, enable rcvr    */
  TMOD |= 0x20;     /* TMOD{timer 1, mode 2, 8-bit reload      */
  TH1  = 0xf3;      /* TH1{ reload value for 2400 baud         */
  TR1  = 1;         /* TR1{ timer 1 run                        */
  TI   = 1;         /* TI{  set TI to send first char of UART  */
#endif

  printf )"Hello World\n":;  /* the 'printf' function call     */

#pragma asm         /*начало вставки ассемблерного блока.*/
  jmp $;
#pragma endasm      /*завершение ассемблерного блока.*/
"


Нажимаем ”Rebuild all target files” и получаем fatal error, в которой говорится что не найден hello.obj файл. Так и должно быть. Ведь как я уже упоминал, компилятор не может одновременно сгенерировать и .src-файл и .obj-файл. Заходим в каталог с проектом hello, смотрим чего у нас получилось. Видим, что компилятор создал hello.src, но нет, hello.obj, который необходим  линковщику. Придется создать его самим. Пропустим hello.src через a251.exe, сгенерируется hello.obj Теперь проект наш будет собираться на ура! Все. Может быть эту последовательность можно как-то автоматизировать или с оптимизировать. Я описал, на мой взгляд, самый простой и доходчивый метод.
Записан
Yura
Гость
« Ответ #4 : 21-04-2004 15:27 » 

Всё сделал как написано(только для х51), а предупреждения всё равно выскакивают и HEX как не было так и нету .Причём пробовал на проекте Hello.
От генерации OBJ файла избавился, OBJ файл создал из SRC файла в коммандной строке. А линковка проходит с выдачей предупреждений. А если используешь расширеный ассемблер то вообще ошибки, но с тем-же текстом.
Может у кого есть пример для х51?
Записан
NeilPryde
Гость
« Ответ #5 : 22-04-2004 05:23 » 

Какие предупреждения выдаются??
Аж самому интересно стало. Вышлите мне исходные файлы, попробую собрать. Улыбаюсь napkin собака mail.ru
Записан
Yura
Гость
« Ответ #6 : 23-04-2004 18:08 » 

Цитата

Какие предупреждения выдаются??

Так яже писал ренее:
Цитата

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: ?C?SCDIV
MODULE: dbg2.obj (DBG)


А что косаемо:
Цитата

Аж самому интересно стало. Вышлите мне исходные файлы, попробую собрать.  napkin собака mail.ru

Обязательно вышлю в субботу 24 апреля.
Мне самому не вериться что может быть виноват компилятор. Такой баг давнобы заметели. Но и сам я до потери пульса испробовал всё что можно
только.
Записан
Yura
Гость
« Ответ #7 : 27-04-2004 19:21 » 

NeilPryde
Спасибо за содействие, вроде разобрался.
Но документированого обоснования своих действий так и не нашёл, а это нехорошо.
Записан
Yura
Гость
« Ответ #8 : 27-04-2004 19:43 » 

Да кстати по поводу хорошо писать на ассемблере или это "дурной тон"
В доке по ASM 51 на стр. 81 сказано
Цитата

The HDATA and HCONST memory can be accessed with CPU instructions only
in the Philips 80C51MX and the 251 architecture. HDATA and HCONST
memory is simulated with memory banking on classic 8051 devices. The
HDATA and HCONST memory class is not possible with A51 and BL51.

Что означает что Keil готов работать с EEPROM только на "Philips 80C51MX and the 251 architecture", а для остальных симуляция банкирования памяти. Выходит что без ассемблера никак.
Записан
NeilPryde
Гость
« Ответ #9 : 28-04-2004 07:01 » new

Напрямую команды контроллера использовать может быть можно только и в этих контроллерах. В остальных, обращение можно проводить через специализированные регистры. Никто не запрещает использовать в программе на C файл regs.h, в котором все они определяются. Работа с ними на С ничем не отличается от работы на ASM. Пишется набор функций доступа к EEPROM на С, которые потом используются в проекте.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines