Имеется dsPIC33FJ64GP206. Память разбита на Boot Segment (0x0200..0x07FF, уровень безопасности - High, защита от записи включена) и General Segment (уровень безопасности - Standard). В Boot Segment лежит загрузчик и, соответственно, п/п записи/чтения Flash.
Загрузчик и п/п работы с Flash полностью отлажены и работают.
В какой-то момент потребовалось писать в Flash непосредственно из основной программы, т.е. из GS в GS. Однако при попытке стирания страницы возникает прерывание Address Error Trap. Основная пикантность ситуации в том, что п/п работы с Flash находятся в BS, т.е. фактически запись в Flash производится из BS, также как и при работе загрузчика. Эта проблема возникает и при стандартном уровне безопасности BS. Если убрать BS, то запись работает.
Кто-нибудь сталкивался с такой проблемой? Может я что-то упустил (в Errat-ах ничего похожего не описано)?
Примечание.
Я в курсе, что при высоком уровне безопасности BS переход в него из GS возможен только на первые 32 команды. Поэтому из GS вызываются не сами п/п работы с Flash, а "обертки", расположенные в начале BS. Т.е. начало листинга BS выглядит след. образом:
Код
Line Address Opcode Label Disassembly
257 0200 0407A8 IAP_ReadLatch goto ReadLatch
258 0202 000000 nop
259 0204 04079C IAP_WriteLatch goto WriteLatch
260 0206 000000 nop
261 0208 0407DA IAP_ReadPage goto ReadPage
262 020A 000000 nop
263 020C 04073C IAP_WritePage goto WritePage
264 020E 000000 nop
265 0210 0407B0 IAP_ErasePage goto ErasePage
266 0212 000000 nop
267 0214 040782 IAP_VerifyPage goto VerifyPage
268 0216 000000 nop
269 0218 4787E4 _monitor add.w w15,#4,w15
270 021A 210D2E mov.w #0x10d2,w14
257 0200 0407A8 IAP_ReadLatch goto ReadLatch
258 0202 000000 nop
259 0204 04079C IAP_WriteLatch goto WriteLatch
260 0206 000000 nop
261 0208 0407DA IAP_ReadPage goto ReadPage
262 020A 000000 nop
263 020C 04073C IAP_WritePage goto WritePage
264 020E 000000 nop
265 0210 0407B0 IAP_ErasePage goto ErasePage
266 0212 000000 nop
267 0214 040782 IAP_VerifyPage goto VerifyPage
268 0216 000000 nop
269 0218 4787E4 _monitor add.w w15,#4,w15
270 021A 210D2E mov.w #0x10d2,w14