I don’t know of any existing resources that discuss using UML specifically for C. As others have mentioned, UML is language-agnostic.
Keep in mind that with UML, you can have a model for the problem domain, and another for the implementation. Try not to model the problem domain in terms of C, but rather as high-level OO. Once you understand the problem domain adequately enough, you can begin modeling an implementation.
For modeling procedural-style C implementations, the following diagrams could be useful:
- Class diagram:
- Show C module APIs
- Show C module relationships (mostly dependencies for non-OO)
- Show structures and enumerations (using < < stereotype> >)
- Package diagram: Show contents (modules) of libraries, and the dependency relationships between libraries
- Activity diagram: Flowcharting non-trivial algorithms
- Sequence/collaboration diagram: Show how events/messages between modules/entities/inputs/outputs occur in time
- Statechart diagram: For state machines, of course!
Expanding on class diagrams, you can “abuse” them in the following way for procedural-style C:
- Global extern functions -> public methods
- Local static functions -> private methods
- Global extern variables -> public members
- Local static variables -> private members
- Structs -> class with “struct” stereotype
#define
constants -> class with “enumeration” stereotype
Experiment, and you’ll find your own conventions for abusing UML.