Я был в этой ситуации пару раз сам.Каждый раз, когда я заканчивал «кататься самостоятельно», я определенно не страдаю от синдрома «Не изобретено здесь» (NIH).Иногда пространство, время выполнения обработки или требования к надежности / восстановлению делают этот путь наименее болезненным.
Поэтому вместо того, чтобы писать великий американский роман по этой теме, я просто выскажу некоторые мысли здесь, так какВаш вопрос довольно широкий (но спасибо, что вы хотя бы задали вопрос и предоставили информацию).
Есть ли C ++ на столе?Встроенные функции, шаблоны и некоторые библиотеки Boost могут быть полезны здесь.Но я предполагаю, что это просто C.
Если вы используете C99, вы можете по крайней мере использовать встроенные функции, которые на шаг выше макросов, когда речь идет о безопасности типов.
Возможно, вы захотите подумать об использовании нескольких мьютексов для защиты различных частей данных;даже если обновления выполняются быстро, вы можете разбить данные на разделы (например, данные конфигурации, данные инициализации, данные регистрации ошибок, данные трассировки и т. д.) и назначить каждому свой мьютекс, уменьшая точки воронки / дросселирования.
Вы можете также рассмотреть вопрос о том, чтобы весь доступ к данным проходил через задачу сервера.Все операции чтения и записи проходят через API, который связывается с задачей сервера.Задачи сервера извлекают запросы на чтение и запись по очереди из своей очереди, быстро обрабатывают их, записывая в зеркало ОЗУ, отправляя ответы при необходимости (по крайней мере, для запросов на чтение), а затем при необходимости буферизуют данные в NVM в фоновом режиме.Звучит тяжеловесно по сравнению с простыми мьютексами, но имеет свои преимущества в определенных случаях использования.Не знаю достаточно о вашем приложении, чтобы знать, если это возможно.
Одна вещь, которую я скажу, это идея получения / установки по тегу (например, может быть список перечислений, таких как CONFIG_DATA, ADDRESS_DATA,и т. д.) это огромный шаг вперед от прямой адресации данных (например, «дайте мне 256 байтов по адресу ox42000). Я видел, что многие магазины испытывают сильную боль, когда вся схема физической адресации, наконец, выходит из строя, и им нужно-фактор / редизайн. Постарайтесь отделить «что» от «как» - клиенты не должны знать или заботиться о том, где хранятся вещи, насколько они велики и т. д. (Вы, возможно, уже знаете все это,извините, если так, я просто вижу это все время ...)
И последнее. Вы упомянули мьютексы. Остерегайтесь инверсии приоритетов ... которые могут заставить эти "быстрые обращения" занимать очень много времени вв некоторых случаях. Большинство реализаций мьютекса ядра позволяют вам учитывать это, но часто это не включено по умолчанию. Опять же, извините, если это старые новости ...