Цитата(sKWO @ Mar 9 2008, 19:44)

в хедере Bitmap.h массив карты const __flash char IMAGE[];
Неправильно. Вы определили массив в Bitmap.h, теперь, если вы включите этот файл в два (три, несколько) файла, в которым вам потребуется этот массив, в каждом из этих файлов окажется по копии этого массива, а это явно не то, что вы хотели (даже если не считать того, что все эти копии будут иметь одинаковое имя и линкер не будет знать, какой именно из этих массивов использовать). Вам надо было лишь описать этот массив, чтобы компилятор во всех файлах, использующих этот массив имел возможность сгенерировать правильные команды доступа и проверить правильность использования массива программистом. Итак, поскольку массив у вас констатный, лежит во флеш, состоит из uint8_t, то его так и надо описать: uint8_t const __flash IMAGE[128*8]; Причем собственно "тело" этого массива будет описано в другом файле (наверное в Bitmap.c), поэтому в заголовочном файле его надо описать с квалификатором extern:
Код
#ifndef BITMAP_H // "стражи" одного включения должны охватывать весь файл
#define BITMAP_H
// #include <pgmspace.h> // ИАР понимает __flash беэ включения этого файла, и никакие функции из pgmspace.h в bitmap.h не используются, поэтому и включать его тут не нужно
#include <stdint.h> // для использования uint8_t и подобных надо включать stdint.h, а не inttypes.h, и полный путь тоже не нужен - выберите Normal DLIB в Project->Options->General->Library Configuration.
extern uint8_t const __flash IMAGE[128*8];
#endif // BITMAP_H
Соответственно определение массива уходит в Bitmap.c: uint8_t const __flash IMAGE[128*8] = { ....... };
Цитата(sKWO @ Mar 9 2008, 19:44)

в Bitmap.с написал так
Код
FuncFlash(char __flash *str_)
{
while (*str_++ != 0);
}
Вы не указали тип возвращаемого функцией значения. Если функция ничего не возвращает, то этот тип должен быть void. Странно, что компилятор молча скушал это и подставил int как возвращаемое значение. Это вылезет боком позже. Ваша функция не изменяет данные, к которым обращается через указатель, поэтому возьмите за правило в таких случаях объявлять указатель в параметрах как указатель на константные данные (не важно, что вы там же указываете __flash). Такой подход имеет два плюса - во-первых не помешает вам передавать в такую функцию указатель на неконстантные данные, а во-вторых компилятор обругает вас и спасет от ошибки, если вы внутри функции все же попытаетесь данные изменить. И вам не придется менять это правило при переходе на любой другой процессор или компилятор, у которого нет ключевого слова __flash. Итого: void FuncFlash(char const __flash *str_).
Цитата(sKWO @ Mar 9 2008, 19:44)

Код
by = FuncFlash((char __flash*)(bitmap++));
Вот видите - вы поскупились на const в объявлении функции и вам пришлось делать явное приведение типов. Явное приведение - это первый звоночек о не совсем удачной реализации. А уж "убирание" const через явное приведение типа - вообще удар колокола, такое в программе допустимо только в загрузчике, где действительно
надо писать в read-only область.
Цитата(sKWO @ Mar 9 2008, 19:44)

Правда после 167 ошибки вылезла 27
27 Entry entry in module module (file) redefined in module module (file)
There are two or more entries with the same name. XLINK aborts immediately.
пришлось #include "Bitmap.h" в котором находится массив обявить его как extern ну и прототип функции
соответственно:
Вот-вот. Причем не "пришлось", а так и надо было делать сразу.
Цитата(sKWO @ Mar 9 2008, 19:44)

Появилось предупреждение:
Warning[w6]: Type conflict for external/entry "FuncFlash", in module ks0108 against external/entry in module Bitmap;
У вас эта функция объявлена в двух местах и объявления эти отличаются. Непонятно, что тут вас смущает - просто сделайте все объявления одинаковыми. Именно поэтому объявления функций, используемых более чем в одном файле выносятся в заголовочные файлы - включая заголовочный файл вы всегда подключаете идентичные объявления.
Покопал ks0108.c - оказывается FuncFlash должна что-то возвращать, причем судя по сравнению с '\0' и '\n' - возвращать должна скорее всего char. А у вас она по умолчанию возвращает int - и вы имеете совершенно лишние операции с двухбайтным данным вместо однобайтного.
Попробовал компилировать исходники - там у вас какая-то путаница из char, const char, uint8_t - приведите их в порядок. char используйте только тогда, когда речь идет о
символах. Если этот символ не изменяется функцией - используйте char const. Если речь идет о
байте - используйте uint8_t, если этот байт в функции не изменяется - uint8_t const. Поверьте, выработав в себе такую дисциплину, вы сократите время понимания своих же исходников и избежите дурацких ошибок. В качестве проверки можете использовать такую - мне удалось выкинуть все явные приведения типов из вашего исходника.
Еще замечание - в ks0108.c у вас есть строчка #include "iom168.h" - она не совсем корректна. Во-первых, в кавычках указывается имя файла, лежащего в текущей директории. А iom168.h находится в директориях компилятора, поэтому его имя надо указывать в угловых скобках. Во-вторых - точно также как в avr-gcc есть файл <avr/io.h> который сам подключает заголовочный файл для нужного процессора, также и у IAR есть заголовочный файл <ioavr.h>, и включать в проект надо его. Тогда сменив в опциях проекта тип процессора вам не придется лазить по всем исходникам и менять везде заголовочный файл.