Преамбула.
Неоднократно видел информацию, что будто бы у СПК107 весьма скромный ресурс записи у внутренней флеш-памяти, и поэтому разработчикам настоятельно рекомендуется всю отладку производить в оперативке, не создавая загрузочное приложение, а то, мол, внутренняя флешка исчерпается, и кирдык вашей панельке... Но иногда бывает невозможно отлаживать программу без загрузочного приложения!
Случай А: аппарат стоит в цехе, и он большой, в КБ его не притащишь, а что-то отладить на "голой" панели - никак; переезжать вместе с компом в цех - некомфортно и хлопотно, к тому же там нет ни эзернета, ни вайфая...
Случай Б: у разработчика в плане 10 приложений, но никто не даст ему для них 10 панелек, приходится все делать на одной, которая, естественно, со временем становится потертой и "потыканной", на продажу такую не выставишь, а для разработки - вполне, но... ресурс!
Может еще какие резоны есть - мне хватило этих двух. Мысль такая: берем двух-четырех-восьмигиговую СДшку за 200 р., втыкаем ее в слот, включаем панельку, она грузит приложение с данной СД-карты и выполняет. Выключаем, меняем СД-карту, включаем... и - о чудо! - запускается другое приложение. При этом перешивать ничего не нужно, кроме, собственно, СД-карты (ну а если у нее исчерпается ресурс - не беда, 200 р. - ладно уж, где-нибудь наскребем).

Как это сделать? Не то что бы очень просто, но не так уж и сложно.
1. Заводим на своем компьютере в укромном месте каталог etc.
2. Коннектимся к панельке через SCP, заходим в ее /etc и скачиваем скрипты /etc/profile, /etc/rc.local и до кучи /etc/rc.usb_sd_cpy (последний не обязательно, но там просто ошибка, заодно исправим ее, хотя, если вы не собираетесь ставить приложения через USB-флеш, то ее можно проигнорировать).
3. Читаем скрипт /etc/rc.local и постепенно понимаем, как оно там работает))) - а именно, что есть разные "бутмоды", из которых нас интересует та, которая там никак не называется, а во всех остальных бутмодах нам хотелось бы, чтобы всё работало, как раньше (ну, это дело вкуса). Поэтому:
3а) в конструкции
Код:
if [ "$BOOT_MODE" == "conf" ]; then
    RETAIN_FILE=\\/mnt\\/ufs\\/root\\/retain\\/retain_cnf.bin
else
    RETAIN_FILE=\\/mnt\\/ufs\\/root\\/retain\\/retain.bin
fi
для "conf" строчку оставляем, а для else пишем так:
Код:
	sleep 8
	if [ -f /mnt/ufs/media/mmcblk0p1/retain/retain.bin ] ; then
	    RETAIN_FILE=\\/mnt\\/ufs\\/media\\/mmcblk0p1\\/retain\\/retain.bin
	else
	    RETAIN_FILE=\\/mnt\\/ufs\\/root\\/retain\\/retain.bin
	fi
3б) поскольку у нас карточка будет уже с конфигом и ритейном, все строчки вплоть до
# check each CoDeSys config: if retain memory params are wrong - fix it.
- пропускаем; а дальше вместо
Код:
CODESYS_CONFIGS="/root/CoDeSysSP/CoDeSysSP.cfg /root/CoDeSysSP_wrk/CoDeSysSP.cfg"
пишем:
Код:
CODESYS_CONFIGS="/mnt/ufs/root/CoDeSysSP/CoDeSysSP.cfg /mnt/ufs/media/mmcblk0p1/CoDeSysSP_wrk/CoDeSysSP.cfg"
(На самом деле, если мы не правили адрес и размер ритейн-памяти, следующие строчки никогда не сработают, но пусть уж будут.)

3в) дальше идет настройка режима ком-портов:
Код:
if [ -f /mnt/ufs/root/setup_com ]; then
  chmod 755 /mnt/ufs/root/setup_com
  /mnt/ufs/root/setup_com
...
Но мы же хотим, чтобы ком-порты настраивались под наше приложение, поэтому обвяжем всю эту конструкцию if...fi следующим:
Код:
if [ -f /mnt/ufs/media/mmcblk0p1/setup_com ]; then
	/mnt/ufs/media/mmcblk0p1/setup_com
else
(все, что там было, оставляем)
fi
(чмод не делаем, потому как у нас на карточке равнодушный к этому веселому слову vfat; к счастью, файлы там и так с атрибутом 'x', а то пришлось бы повозиться.)

3г) дальше самое интересное: запуск нашего приложения; в исходном варианте видим:
Код:
if [ "$BOOT_MODE" == "conf" ]; then
    nice -n 10 /root/retain/rmsync -s 1 -v -v &
    cd /mnt/ufs/root/CoDeSysSP
    nice -n 10 ./codesyssp -qws >/dev/null 2>&1 &
else
# run retain memory synchronizer for CodeSys
  nice -n 10 /root/retain/rmsync -s 1 -v -v &
  cd /mnt/ufs/root/CoDeSysSP_wrk
  if [ "$BOOT_MODE" == "uprj" ]; then
    . /etc/rc.usb_sd_cpy
  fi
  nice -n 10 ./codesyssp -qws >/dev/null 2>&1 &
fi
Естественно, для "conf" оставляем все в неприкосновенности, а дальше пишем так:
Код:
else
  if [ -f /mnt/ufs/media/mmcblk0p1/retain/rmsync ] ; then
	  nice -n 10 /mnt/ufs/media/mmcblk0p1/retain/rmsync -s 1 -v -v &
  else
	  nice -n 10 /mnt/ufs/root/retain/rmsync -s 1 -v -v &
  fi
  if [ -d /mnt/ufs/media/mmcblk0p1/CoDeSysSP_wrk ] ; then
	cd /mnt/ufs/media/mmcblk0p1/CoDeSysSP_wrk
  else
	cd /mnt/ufs/root/CoDeSysSP_wrk
  fi
  if [ "$BOOT_MODE" == "uprj" ]; then
    . /etc/rc.usb_sd_cpy
  fi
  nice -n 10 ./codesyssp -qws >/dev/null 2>&1 &
fi
{
Позволю себе лирическое отступление.
Возможно, правильнее было бы вместо
nice -n 10 ./codesyssp -qws >/dev/null 2>&1 &
написать
nice -n 10 /mnt/ufs/root/CoDeSysSP/codesyssp -qws >/dev/null 2>&1 &
однако, какие-то невнятные соображения заставили же кудесников из Овна (или Эс-Эс-Эса? или откуда-то еще?) не класть бинарник codesyssp в /usr/bin (а либы, соответственно, в /usr/lib), как это предписывает нам наша религия, вместо этого они разместили бинарники в домашнем каталоге проекта - в полном соответствии с богомерзкими мастдаевскими традициями... Кто их знает, что они там наворотили в codesyssp, раз его приходится даже дублировать для разных бутмод! Поэтому, ладно уж, не выпендриваемся.
}

Ну вот, rc.local мы поправили. Однако видим, что из него вызываются еще два скрипта: /etc/profile и /etc/rc.usb_sd_cpy...

4. Правим /etc/profile. Единственное, что нас там интересует - это поворот экрана. Поэтому строчку
Код:
if [ -f /mnt/ufs/root/rotate ];
заменяем на
Код:
if [ -f /mnt/ufs/media/mmcblk0p1/rotate ] ;
Теперь, если мы на карточке создадим в корне файл с именем 'rotate', экран у нас перевернется.
На самом деле не проверял, но по логике вроде так.

5. Тем, кто хочет записывать в панельку проекты с внешней УСБ-флешки, придется поправить скрипт /etc/rc.usb_sd_cpy.
Он щедро прокомментирован, поэтому исправить его много ума не требуется. Сразу видим:
Код:
prog_source=/mnt/ufs/media/sda1/app
Угу. Мало того, что в инструкции черным по белому написано:
[цитата]
...
- создать каталог с именем "APP" в корне USB накопителя;
...
- содержимое папки перенести в папку "APP" на USB накопителе;
...
[конец_цитаты]
ладно, не будем придираться, что составители инструкций не различают БОЛЬШИЕ и маленькие буквы (в отличие от линукса, который отродясь различает), это мы поймем, простим и создадим на флешке каталог "app", но вот поменять устройство /dev/sda1 и точку монтирования /mnt/ufs/media/sda1 на правильные /dev/sda и /mnt/ufs/media/sda у нас так просто не получится... Но раз уж мы залезли в скрипт - исправим:
Код:
prog_source=/mnt/ufs/media/sda/APP
prog_src_device=/dev/sda
Опять же, не проверял. Но вроде - должно сработать. (Что раньше не работало - проверял, да, не работало)))
Хотя, возможно, надо в старом CoDeSysSP.cfg убрать строчку вида Application.app=0xABCD, 0x12345678, 12345678.app,
а лучше вообще почистить раздел [SysFileMap], да и старый каталог visu - тоже... Ну да ладно.

6. Хорошо, скрипты мы поправили. Теперь надо заставить их работать на панельке. Поскольку /etc там ожидаемо монтируется как aufs, у нее имеются ro и rw составляющие, представленные, как не трудно догадаться, в /mnt/etcro и /mnt/etcrw соответственно. От правки файлов в /mnt/etcro мы благоразумно воздержимся, и положим наши обновленные скрипты в /mnt/etcrw.
Изначально их там не было, поэтому надо засунуть их туда, откуда, собственно, берется все содержимое каталога /mnt/etcrw. Почитав скрипт /etc/rc.fs видим, что файлы туда растариваются из архива /mnt/ufs/root/etc.tar; значит, надо их туда добавить. Однако, есть одна тонкость: скрипт rc.local должен быть исполняемым, иначе он просто не запустится. Архив tar хранит юниксовые атрибуты файлов, а вот винда не то что их не хранит, она даже не подозревает об их существовании! Не беда - ведь у нас есть юникс-машина - наша панелька.
ОК. Заливаем наши скрипты через SCP в каталог /mnt/etcrw. Коннектимся к панельке через ssh и попадаем в дивный линуксовый шелл с правами рута. Командуем:
Код:
# rm /mnt/ufs/root/etc.tar
# cd /mnt/etcrw
# chmod 0755 ./rc.*
# tar -cf /mnt/ufs/root/etc.tar ./
# tar -tvf /mnt/ufs/root/etc.tar
Последняя команда нужна, чтобы убедиться, что мы все сделали правильно, все атрибуты на месте, символические ссылки показывают куда надо.
Если что-то пошло не так... вы ведь догадались сохранить архив etc.tar в надежном месте, ДО того, как скомандовали 'rm'?))) Будьте бдительны!
Если всё нормально, то панелька готова грузиться с СД-карты.

7. Готовим СД-карту с проектом. Заводим на компьютере любой пустой каталог, например, "Our_application_on_SD-card", а в нем еще два каталога с именами "CoDeSysSP_wrk" и "retain".
Из нашей любимой кодесиськи в оффлайн-режиме сохраняем в Our_application_on_SD-card\CoDeSysSP_wrk "Загрузочное приложение". В каталоге появляются файлы Application.app и Application.crc, а также каталог visu с картинками и разным мутным описаловом.
С панельки по SCP копируете туда же (в "Our_application_on_SD-card\CoDeSysSP_wrk") из каталога /mnt/ufs/root/CoDeSysSP файлы:
3S.dat
codesyssp
CoDeSysSP.cfg
libCmpRSmode.so
libCmpSysExec.so
libSysTargetOEM.so
затем из каталога /mnt/ufs/root/retain копируете в "Our_application_on_SD-card\retain" файлы
retain.bin
rmsync
rmsync.cfg
наконец, из каталога /mnt/ufs/root файл setup_com копируете непосредственно в "Our_application_on_SD-card";
если вы любитель нетрадиционной визуальной ориентации - создаете в "Our_application_on_SD-card" пустой файл 'rotate'.

8. Правим конфиги.
8а) в файле CoDeSysSP.cfg строчку
Код:
Application.1=setupcfg207
меняем на строчку
Код:
Application.1=Application
(Если вы такой же нонконформист, как и я, и не любите имен по умолчанию, у вас вместо безликого масломасляного Application.app будет Self_Described_Name.app, соответственно, вам нужно будет внести в CoDeSysSP.cfg свое
Код:
Application.1=Self_Described_Name
)
Строчку
Код:
setupcfg207.app=0x266BDC, 0x65351C6E, 65351C6E.app
безжалостно удаляем, оставляя раздел [SysFileMap] пустым.
Я еще у себя в конец добавил строки:
Код:
[SysTarget]
NodeName=spk107
- потому что так было в _wrk (не знаю, надо ли? - но не помешало).

8б) в файле rmsync.cfg строчку
Код:
RETAIN_FILE=/mnt/ufs/root/retain/retain.bin
меняем на
Код:
RETAIN_FILE=/mnt/ufs/media/mmcblk0p1/retain/retain.bin
9. Копируем всё содержимое каталога "Our_application_on_SD-card" в корень вашей СД-карты. (Лично у меня единственная щель, куда ее можно было успешно засунуть, нашлась только непосредственно в панельке, так что я слил туда все это хозяйство по тому же SCP, и поскольку я привык не доверять программам, которые написал не я, для верности еще раз зашел на панельку рутом и сказал:
Код:
# sync
# umount /dev/mmcblk0p1
# exit
после чего со спокойной душой выключил питание.)

10. Выключаем панель, вставляем в нее свежеприготовленную СД-карту, включаем панель, томительно ждем... Йес! Видидит!