|
IAP неполучаеццо :(, влетает в эксепршены |
|
|
|
Aug 20 2007, 15:27
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Дошли руки до 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]; } Че я нетак делаю?
|
|
|
|
|
Aug 20 2007, 17:13
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Код ((void( __thumb __interwork *)( ulong *, ulong *))IAP_LOCATION)( (ulong *)iaps, ((ulong*)iaps) + 5 ); Какой изврат  Мало кто способен осмыслить такое  Кстати, __thumb выкинуть на помойку
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 20 2007, 17:23
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Aug 20 2007, 20:13)  Какой изврат  Зато точно любой компилятор поймет  Ну по осмыслению - пишется легко и непринужденно: 1. 0 Берем, например, 0 2. ()0 Будем явно тип преобразовывать 3. (*)0 В указатель 4, ((*)())0 .................. на функцию 5. ((*)(void))0 ........................................без параметров 6. (void(*)(void))0 ничего не возвращающую 7. Ну и вызываем это ((void(*)(void))0)(); При необходимости добавляем параметры и возвращаемые значеня по месту - это совсем легко.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 20 2007, 17:42
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Ну я серьёзно! Пишите уж так: Код ((void( __interwork *)( void *, void *))IAP_LOCATION)( iaps, &iaps->status ); Тоже поймёт любой компилятор и с любыми настройками проекта
Сообщение отредактировал GetSmart - Aug 20 2007, 17:46
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 20 2007, 18:02
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Aug 20 2007, 20:42)  Ну я серьёзно! Пишите уж так: Без +5, естественно красивее, ну а на void * менять не стоит. Я просто за 30 секунд писал не перечитывая года три назад именно в последовательности, как изложил в предыдущем посте  когда структуру ЕЩЕ НЕ описал. Цитата Тоже поймёт любой компилятор и с любыми настройками проекта Естественно, поскольку никаких принципиальных отличий в описании просто нет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 20 2007, 18:24
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo) ну а на void * менять не стоит Это ещё паччему? Когда в Вашем вызове делается преобразование типов, то контроль типа по-любому теряется. Поэтому - можно, и ещё раз - можно. Цитата ...поскольку никаких принципиальных отличий в описании просто нет. Как нет? Я ж написал, что __thumb лишний!?!
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 20 2007, 18:30
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Цитата Ну я серьёзно! Пишите уж так: ((void( __interwork *)( void *, void *))IAP_LOCATION)( iaps, &iaps->status );
Тоже поймёт любой компилятор и с любыми настройками проекта конечно любой.. если задефайнить #define __interwork дело было не в бобине.... я оказывается неправильный адрес передавал обработчику iap  сам дурак.
|
|
|
|
|
Aug 20 2007, 19:10
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Aug 20 2007, 21:24)  Поэтому - можно, и ещё раз - можно. "Можно" многое что, а "нужно" и "правильно" без явных и тем более через void проеобразований типов (откуда у меня преобразования типов остались  - объяснял ) Код ((void( __thumb __interwork *)( struct s_iap *, ulong *))IAP_LOCATION)( iaps, &iaps->status ); Все  отлито в бронзе, рукам не трогать  Цитата Как нет? Я ж написал, что __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 лишняя 'напоминалка', Ну и что? Скобок можно еще лишних напихать, но сути это не изменит.
Сообщение отредактировал zltigo - Aug 20 2007, 20:45
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 24 2007, 08:30
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(klen @ Aug 22 2007, 12:48)  .... бедные несчастные пользователи компиллера IAR... Ну вы блин даете оба... Компилятор не нравится... В общую философию кинулись... Разве тут нужны религиозные войны а-ля кто кого сборет, если слон с китом схватится?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|