Полезность разбиения на логические модули не обсуждается. Полезно и все.

Еще полезно использовать системы отслеживания версий (VSS, Team Coherence и т.п.).
А по поводу кейла и текста (модулей):
1. Если вдруг понадобится разместить массив констант по определнному адресу, то придется
смотреть описание на кейл и переделывать исходный текст, чтобы это сделать.
Подробно см. директиву линковщика "CO". Пример из реального проекта управляющей строки линковщика "?CO?tb_crc8(0FA00H)" - разместить объект tb_crc8 в памяти CODE по адресу 0xFA00.
tb_crc8 - таблица предвычесленных значений tb_crc8[256].
2. Если используешь .lib и необходимо заменить функцию в скомпилированной библиотеке, то
библиотека должна быть скомпилирована так, чтобы заменяемая функция была в отдельном объектном
модуле, т.е. отдельном .c-файле. Т.е. при сборке проекта с .lib, линковщик обнаружив функцию с таким же именем как и в библиотеке попытается ее заменить на вариант из проекта.
Полезность разбиения на логические модули не обсуждается. Полезно и все.

Еще полезно использовать системы отслеживания версий (VSS, Team Coherence и т.п.).
А по поводу кейла и текста (модулей):
1. Если вдруг понадобится разместить массив констант по определнному адресу, то придется
смотреть описание на кейл и переделывать исходный текст, чтобы это сделать.
Подробно см. директиву линковщика "CO". Пример из реального проекта управляющей строки линковщика "?CO?tb_crc8(0FA00H)" - разместить объект tb_crc8 в памяти CODE по адресу 0xFA00.
tb_crc8 - таблица предвычесленных значений tb_crc8[256].
2. Если используешь .lib и необходимо заменить функцию в скомпилированной библиотеке, то
библиотека должна быть скомпилирована так, чтобы заменяемая функция была в отдельном объектном
модуле, т.е. отдельном .c-файле. Т.е. при сборке проекта с .lib, линковщик обнаружив функцию с таким же именем как и в библиотеке попытается ее заменить на вариант из проекта.