This article will introduce how to avoid those hidden but common errors, и описывает несколько технологий, помогающих инженерам найти скрытые ошибки в PCB - репликаторе. Most software development projects rely on a combination of code inspection, структурный тест, функциональный тест на распознавание дефектов программного обеспечения. Хотя эти традиционные технологии очень важны, большинство проблем с программным обеспечением можно обнаружить, they cannot detect many common errors in today's complex systems.
структурные или белые тесты могут эффективно найти логику, control flow, Ошибка вычисления и данных в коде. This test requires a complete overview of the internal workings of the software (hence the term "white box" or "glass box") in order to understand the details of the software structure. проверять каждое условное выражение, mathematical operation, ввод и вывод. Due to the numerous details to be tested, проверка программного обеспечения при испытании конструкции, usually a function or class.
В ходе обзора кода для выявления проблем использовались такие же сложные методы, как и для выявления недостатков и потенциальных проблем. Like white box testing, оценка обычно проводится по каждой единице программного обеспечения, because an effective review process requires centralized and detailed inspections.
В отличие от проверки на & белый ящик, functional testing or black box testing assumes that nothing is known about the implementation of the software. Он проверяет вывод с регулируемым входом. функциональный тест состоит из тестовой программы, разработанной испытателем или разработчиком, which specify the expected program output corresponding to a set of specific program inputs. После тестового запуска, тестер сравнивает фактический вывод с ожидаемым выводом для выявления проблем. Black box testing can effectively find unfulfilled requirements, Проблема интерфейса, Проблема свойства, and errors in the most commonly used functions of the program.
Хотя в сочетании с этими технологиями можно обнаружить большую часть ошибок, скрытых в конкретном программном обеспечении, they also have limitations. Просмотр кода и тест на белый ящик один раз направлены только на небольшую часть кода, игнорировать другие части системы. Black box testing usually treats the system as a whole, игнорировать подробности. Some important problems can only be discovered by focusing on the details of their interaction in the entire system; traditional methods cannot reliably identify these problems. система программного обеспечения должна быть подвергнута тщательной проверке, с тем чтобы выявить конкретные причины конкретных проблем. Since it is usually impossible to thoroughly analyze every detail in the program and its interaction with all other parts of the code, анализ должен касаться конкретных аспектов плана, которые, как известно, могут вызвать проблемы.
This article will explore three potential problem areas:
* stack overflow
* Race conditions
* deadlock
Readers can read the second part of this article online, which will explore the following issues:
* Timing issues
* Reentrant conditions
All of the above problems are quite common in systems that use multi-task real-time design technology.
stack overflow
The processor uses the stack to store temporary variables, передать параметр заданной функции, save the thread "state", и так далее. If the system does not use virtual memory (in other words, it cannot transfer memory pages to disk to free up memory space for other uses), при выпуске продукции дымовая труба будет фиксироваться на размерах продукции. If for some reason the stack goes out of the range allocated by the programmer, план станет неопределенным. This instability can cause serious system failures. поэтому, it is essential to ensure that the system can allocate enough stacks in the worst case.
Единственный способ убедиться, что не будет переполнения стека - проанализировать код, determine the maximum stack usage of the program under various possible conditions, затем проверьте, достаточно ли стеков. The test is unlikely to trigger a specific combination of instantaneous inputs and cause the worst-case scenario in the system.
The concept of stack depth analysis is relatively simple:
1. создать дерево вызовов для каждой отдельной дискуссии.
2. определяет использование стека для каждой функции в дереве вызова.
3. Проверьте каждое дерево вызова для определения того, какой путь от корней дерева к внешней "Листке" наиболее необходим для стека вызовов.
4. Add the maximum stack usage of each independent thread call tree.
5. Determine the maximum stack usage of each interrupt service routine (ISR) in each interrupt priority level and calculate the total. Однако, if the ISR itself does not have a stack and uses the stack of the interrupted thread, Максимальное количество стеков, используемое ISR, должно быть добавлено в каждый стек.
6. для каждого приоритета, add the number of stacks used to save the processor state when an interrupt occurs.
7. If you use RTOS, add the maximum number of stacks required for the internal use of the RTOS itself (different from the system call caused by the application code, which is included in step 2).
Кроме того, there are two important things to consider. фёрст, a call tree built only from high-level language source code is likely to be incomplete. Большинство компиляторов используют библиотеку для оптимизации обычных задач вычисления, such as multiplication and division of large-value integers, операция с плавающей запятой, etc. эти вызовы видны только на компиляторе. The runtime library functions themselves may use a lot of stack space, Они должны быть включены в анализ. If you are using the C++ language, all the following types of functions (methods) must also be included in the call tree: structurers, destructors, грузовой оператор, copy structures, функция преобразования суммы. All function pointers must also be parsed, Они называют функции, которые также включены в анализ.