Цитата(chernenko @ Dec 4 2006, 20:29)

Цитата(Lem @ Dec 4 2006, 10:32)

Цитата(chernenko @ Dec 4 2006, 10:11)

Вобщем задача простая, а как реализовать не знаю... и реализуема ли она вообще. Посоветуйте, пожалуйста.
Нужно срыть каким либо образом часть исходного кода программы, которая написана в IAR.
То есть сделать часть функций в виде какой либо библиотеки, чтобы сами функции были видны, а их реализации срыты и не доступны. Возможно ли это?
Project Options/General/Output:(Executable/Library)
Посмотрите, сам не пробовал (не было нужды), но подозреваю, что это вроде того, что вам нужно.
(на выходе должен получаться бинарный модуль)
Работает и debuger при этом видет функции. Но функции скажем так не прозрачны. Одна проблема. Если при создании бибилотеки презаписать расширение .r90 на .lib то при подключении этой библиотеки в проект, последний ищет библиотеку только .r90 не замечая .lib. Это не принципиально, но для эстетизма хотелось бы иметь библиотеку с расширением .lib. Как это обойти?
А главное стоит ли этот труд каких-либо затрат или все это пустая работа и содержимое библиотеки можно будет легко просмотреть (насколько я понимаю файл библиотеки получается не бинарный)?
Ну это же все просто делается. Странслируйте все необходимые модули и создайте из них библиотеку. Эту библиотеку можно подлючать к вашим проектам. Весь вопрос в том, насколько часто будут используемы модули из этой библиотеки. Проблема чаще всего заключается в том, что, как правило, добрая часть программы очень тесно привязана к "железу". Поэтому сделать такие программные модули универсальными весьма проблематично. По крайней мере, на Си. На ассемблере с этим проблем меньше, ассеблер такие вещи делать позволяет. Ниже мой пример подобного универсального модуля программного вывода по последовательному каналу.
Код
module SerialOut
;
; File: sout.s90
;
; 08-Sep-05 BK Initial edit
; 28-Sep-05 BK Last update
;
$fmacros.inc
;
; External references
;
; extern N$BITS ; The number of bits to be transmitted
N$BITS = 16 ;
extern SDAT$PORT, SDAT$BIT, SDAT$DDR; The data output port
extern SCLK$PORT, SCLK$BIT, SCLK$DDR; Clock control port
rseg CODE ; Code segment
;
; ** SerialOut -- the function outputs N$BITS of data serially through
; the SDAT$BIT of the MCU port SDAT$PORT. The output starts
; from the MSB of data.
; ASM usage:
; r16 - low byte of data;
; r17 - high byte of data;
; r18 - the number of bits (N$BITS) for output.
; C usage:
; void SerialOut(unsigned data, char nbits);
;
; ** SerialOutW -- the same as the function above, but N$BITS is 16.
;
; ASM usage:
; r16 - low byte of data;
; r17 - high byte of data;
; C usage:
; void SerialOutW(unsigned data);
;
ENTRY$ SerialOutW
ldi r18, N$BITS ; Set bit counter
ENTRY$ SerialOut
?0: sbrs r17, 7 ; Form a data bit
cbi SDAT$PORT, SDAT$BIT ;
sbrc r17, 7 ;
sbi SDAT$PORT, SDAT$BIT ;
sbi SCLK$PORT, SCLK$BIT; Form a clock pulse
lsl r16 ; (Shift word of data left)
rol r17 ;;
cbi SCLK$PORT, SCLK$BIT ;
dec r18 ; Bump counter
brne ?0 ; Loop if not done yet
ret
;
; ** InitSerial -- the function initiates serial port.
;
; C usage:
; void InitSerial(void);
;
ENTRY$ InitSerial
sbi SCLK$DDR, SCLK$BIT; Set serial port as output
sbi SDAT$DDR, SDAT$BIT ;
cbi SCLK$PORT, SCLK$BIT; Set initial levels on clock
cbi SDAT$PORT, SDAT$BIT; and data bits
ret
end
Обратите внимание, что и порты и отдельные разряды в модуле определены как внешние. Конкретные их значения могут менятся от программы к программе. Для этого их в нужно просто определить в конкретной программе сообответсвующим образом и, опять же, на ассемблере.