Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAP неполучаеццо :(
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
klen
Дошли руки до IAP, прочитал мануал, написал код - сначала не работало, потом заработало, чето потрогал руками опять перестало работать. Пока тренируюсь на вызове запроса partID. стопрацентный заход в PAbort или DAbort, в эксепшене lr коворит адрес 0x7ffffff8, прерывания отключены, вызов иапа сразу в начале main.


код вызова:
Код
#include "iap.h"

#define IAP_LOCATION 0x7ffffff1

unsigned int command[5];
unsigned int result[2];

#define PrepareSectors4Write 50
#define RAM2Flash            51
#define EraseSectors         52
#define BlankCheckSectors    53
#define ReadPartID           54
#define ReadBootCodeVersion  55
#define Compare              56
#define ReinvokeISP          57


#define CMD_SUCCESS         0      //  Command is executed successfully.
#define INVALID_COMMAND     1      //  Invalid command.
#define SRC_ADDR_ERROR      2      //  Source address is not on a word boundary.
#define DST_ADDR_ERROR      3      //  Destination address is not on a correct boundary.
#define SRC_ADDR_NOT_MAPPED 4      //  Source address is not mapped in the memory map.
#define DST_ADDR_NOT_MAPPED 5      //  Destination address is not mapped in the memory
#define COUNT_ERROR         6      //  Byte count is not multiple of 4 or is not a permitted value.
#define INVALID_SECTOR      7      //  Sector number is invalid.
#define SECTOR_NOT_BLANK    8      //  Sector is not blank.
#define SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 9 //Command to prepare sector for write operation was not executed.
#define COMPARE_ERROR       10     //  Source and destination data is not same.
#define BUSY                11  


typedef void (*IAP)(unsigned int*,unsigned int* );
IAP iap_entry =(IAP) IAP_LOCATION;

void GetPartID ( unsigned int* pid  )
{
   command[0] = ReadPartID;
   result[0]=-1;
   result[1]=-1;
   iap_entry (command, result);
  
   *pid = result[1];
}


Че я нетак делаю?
zltigo
Цитата(klen @ Aug 20 2007, 18:27) *
Че я нетак делаю?

smile.gif
Начни с начала мануала!
Рабочий огрызочек в приложении.
klen
Цитата(zltigo @ Aug 20 2007, 19:51) *
Начни с начала мануала!


Что мне подсказывало что нада МАМ выключить... и даже PLL..

в тестовом примерчике заработало, буду пробыать вкрутить в проект и сделать прошивания по usb.
большое спасибо.
zltigo
Цитата(klen @ Aug 20 2007, 20:01) *
Что мне подсказывало что нада МАМ выключить... и даже PLL..

Это только для ~3 летней давности bootloader-ов было актуально - потом поправили.
GetSmart
Код
((void( __thumb __interwork *)( ulong *, ulong *))IAP_LOCATION)( (ulong *)iaps, ((ulong*)iaps) + 5 );
Какой изврат smile.gif
Мало кто способен осмыслить такое smile.gif
Кстати, __thumb выкинуть на помойку smile.gif
zltigo
Цитата(GetSmart @ Aug 20 2007, 20:13) *
Какой изврат smile.gif

Зато точно любой компилятор поймет smile.gif
Ну по осмыслению - пишется легко и непринужденно:


1. 0 Берем, например, 0
2. ()0 Будем явно тип преобразовывать
3. (*)0 В указатель
4, ((*)())0 .................. на функцию
5. ((*)(void))0 ........................................без параметров
6. (void(*)(void))0 ничего не возвращающую
7. Ну и вызываем это ((void(*)(void))0)();
При необходимости добавляем параметры и возвращаемые значеня по месту - это совсем легко.
GetSmart
Ну я серьёзно! Пишите уж так:
Код
((void( __interwork *)( void *, void *))IAP_LOCATION)( iaps, &iaps->status );

Тоже поймёт любой компилятор и с любыми настройками проекта
zltigo
Цитата(GetSmart @ Aug 20 2007, 20:42) *
Ну я серьёзно! Пишите уж так:

Без +5, естественно красивее, ну а на void * менять не стоит. Я просто за 30 секунд писал не перечитывая года три назад именно в последовательности, как изложил в предыдущем посте smile.gif когда структуру ЕЩЕ НЕ описал.
Цитата
Тоже поймёт любой компилятор и с любыми настройками проекта

Естественно, поскольку никаких принципиальных отличий в описании просто нет.
GetSmart
Цитата(zltigo)
ну а на void * менять не стоит
Это ещё паччему? Когда в Вашем вызове делается преобразование типов, то контроль типа по-любому теряется. Поэтому - можно, и ещё раз - можно.
Цитата
...поскольку никаких принципиальных отличий в описании просто нет.
Как нет? Я ж написал, что __thumb лишний!?!
klen
Цитата
Ну я серьёзно! Пишите уж так:
((void( __interwork *)( void *, void *))IAP_LOCATION)( iaps, &iaps->status );

Тоже поймёт любой компилятор и с любыми настройками проекта

конечно любой.. если задефайнить
#define __interwork


дело было не в бобине....
я оказывается неправильный адрес передавал обработчику iap sad.gif
сам дурак.
zltigo
Цитата(GetSmart @ Aug 20 2007, 21:24) *
Поэтому - можно, и ещё раз - можно.

"Можно" многое что, а "нужно" и "правильно" без явных и тем более через void проеобразований типов
(откуда у меня преобразования типов остались smile.gif - объяснял )
Код
    ((void( __thumb __interwork *)( struct s_iap *, ulong *))IAP_LOCATION)( iaps, &iaps->status );

Все smile.gif отлито в бронзе, рукам не трогать smile.gif
Цитата
Как нет? Я ж написал, что __thumb лишний!?!

Допустимый.
Цитата
Description
The __thumb keyword makes a function execute in Thumb mode. Unless the function is also declared __interwork, the function declared __thumb can only be called from functions that also execute in Thumb mode.


Более того по IARу
Цитата
__interwork
Syntax
Follows the generic syntax rules for type attributes that can be used on functions, see Type attributes.

Description
A function declared __interwork can be called from functions executing in either ARM or Thumb mode.

Example
typedef void (__thumb __interwork *IntHandler)(void);


Или __interwork лишняя 'напоминалка', Ну и что? Скобок можно еще лишних напихать, но сути это не изменит.
GetSmart
Объясняю на пальцах.
Атрибут __interwork задаёт вызов функции в универсальном формате (из любого режима в любой режим). На компиляцию процедуры не влияет.
Атрибут __thumb задаёт компиляцию функции в thumb формате кода. Но без __interwork её невозможно вызвать из ARM режима.

Итог:
Так как в данном случае нет никакой компиляции, а есть только указание о вызове процедуры, то __thumb тут ни к селу, ни к городу.
zltigo
Цитата(GetSmart @ Aug 21 2007, 11:03) *
Объясняю на пальцах.

Читайте по губам еще раз - напоминалка о том, что представляет из себя вызываемая функция.
klen
.... бедные несчастные пользователи компиллера IAR...
Николай Z
Цитата(klen @ Aug 22 2007, 12:48) *
.... бедные несчастные пользователи компиллера IAR...


Ну вы блин даете оба... smile3009.gif
Компилятор не нравится... В общую философию кинулись...

Разве тут нужны религиозные войны а-ля кто кого сборет, если слон с китом схватится? beer.gif
zltigo
Цитата(klen @ Aug 22 2007, 11:48) *
.... бедные несчастные пользователи компиллера IAR...

Каким тут боком вообще IAR? И 'бедность' пользователей?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.