Реализовывая C потоки файла (ФАЙЛ *, fopen, освобожденный, и т.д.) на встроенной платформе

Для меня определили задачу с добавляющей потоковой поддержкой (C89/C90) к библиотекам для встроенного компилятора C наследия моей компании. Наши целевые аппаратные средства обычно имеют 1 МБ, или меньше кода располагают с интервалами, и не имеет операционной системы.

У нас есть много подобных потоку реализаций всюду по кодовой базе, которую я могу использовать в качестве начальной точки. Например, консоль, которая работает по сокеты TCP или последовательный порт, веб-сервер, который читает из FAT на SD-карте или файле в оперативной памяти и даже встроенном микропрограммном обеспечении updater, который читает из многих источников.

Прежде чем я пойду и изобрету велосипед, я задаюсь вопросом, существуют ли существующие реализации, которые я мог или портировать или использовать в качестве начальной точки для своей работы. Даже при том, что мы предоставляем полный исходный код нашим клиентам, GPL-лицензированный код не является опцией, так как наши клиенты не хотят выпускать исходный код к своим продуктам.

Кто-либо может рекомендовать книгу (аннотируемый источник Unix, текст CompSci) или общественное достояние/BSD-licensed источник? Я предпочел бы смотреть на более старую ОС, предназначенную к единому устройству, поскольку текущие операционные системы содержат путаницу макросов и слои определений типов, которые делают следующее даже простым определением структуры трудный.

5
задан tomlogic 4 February 2010 в 17:54
поделиться

5 ответов

ОБНОВЛЕНИЕ: Начиная с Django 1.8, это встроено.

См. этот ответ и официальную документацию .

СТАРЫЙ ОТВЕТ:

В конце я нашел простое решение.

Я создаю новый шаблон с именем linked.html , который является копией tabular.html , и добавил этот код для создания ссылки.

{% if inline_admin_form.original.pk %}
          <td class="{{ field.field.name }}">
              <a href="/admin/{{ app_label }}/{{ inline_admin_formset.opts.admin_model_path }}/{{ inline_admin_form.original.pk }}/">Full record</a>
          </td>
{% endif %}

Затем я создал новую модель LinkedInline , наследующую InLineModelAdmin

#override of the InlineModelAdmin to support the link in the tabular inline
class LinkedInline(admin.options.InlineModelAdmin):
    template = "admin/linked.html"
    admin_model_path = None

    def __init__(self, *args):
        super(LinkedInline, self).__init__(*args)
        if self.admin_model_path is None:
            self.admin_model_path = self.model.__name__.lower()

Тогда при определении новой встроенной модели мне придется использовать только LinkedInline вместо обычного InLineModelAdmin .

Надеюсь, это может быть полезно для других людей.

Джованни

-121--1317445-

Мы используем Haskell, OCaml и (сейчас) F #, поэтому для нас это не имеет ничего общего с отсутствием C-подобного синтаксиса. Скорее, мы пропускаем Erlang потому, что:

  • Он динамически набран (мы фанаты Haskell's type system)
  • Не предоставляет «реальный» тип последовательности (я понимаю почему, но это раздражает, что это еще не было исправлено на уровне языка)
  • Имеет тенденцию иметь плохие (неполные или незанятые) драйверы базы данных
  • . Если да, то это не очень заметно. У Хаскелла, по крайней мере, есть Хакейдж, и я бы предположил, что это то, что мы выбираем этот язык, а не любой другой. В средах Windows F # получит здесь максимальное преимущество.

Возможно, есть и другие причины, о которых я сейчас не могу думать, но это основные точки.

-121--865225-

Ознакомьтесь с книгой П.Дж. Плаугера Библиотека Standard C , в которой подробно описывается одна возможная реализация полной библиотеки стандартов C89.

8
ответ дан 18 December 2019 в 10:44
поделиться

Проверьте свои инструменты разработки. Некоторые инструменты разработки поставляются с исходным кодом для своих программных библиотек.

Я взял исходный код для printf компилятора и адаптировал его для порта отладки во встроенной системе. Когда есть фундамент, на котором можно строить, работы становится меньше.

0
ответ дан 18 December 2019 в 10:44
поделиться

Вы сможете извлечь большую часть того, что вам нужно, из исходного кода для стандартной библиотеки GNU C . Он лицензирован по Lesser GPL , что означает, что вы можете ссылаться на библиотеку, не влияя на лицензию вашего программного обеспечения (или заставляя ваших клиентов выпускать свой код). Перенести это на вашу платформу (таким образом, сохранить код LGPL в собственной библиотеке) может быть проще, чем реализовать свой собственный с нуля.

Несколько разных проектов взяли GNU GLIBC и оптимизировали ее для встраиваемых систем. Вы можете посмотреть:

В частности, EGLIBC и uLIBC были разработан для правильной работы во встроенных системах, в которых отсутствует MMU.

Вы также можете ознакомиться с реализацией libc в BSD.

В качестве альтернативы существует STLSoft , который предоставляет несколько библиотек (включая стандартную библиотеку C) под лицензией BSD. Я не могу подтвердить их качество, поскольку сам не использовал их код, но, возможно, стоит взглянуть на него, если вы не можете внедрить код LGPL в свой проект.

5
ответ дан 18 December 2019 в 10:44
поделиться

Не подойдет ли libc из * BSD (Net | Open | Free)? По крайней мере, в качестве отправной точки.

2
ответ дан 18 December 2019 в 10:44
поделиться

Попробуйте посмотреть http://www.minix3.org/

1
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: