As shown in the figure below, why does the api read this variable with critical protection?
Suppose two tasks have write operations to shared variables. For example:
var = 1;
var = 2;
In the OS source code, you can see that a critical section must be added to the shared variable write operation. There is no read-modify-write, and it should not cause a race condition. Why do you need to add a critical section?
If the compiler has done level optimization, there may be a write cache for variable writes. In this case, should the DSB data synchronization barrier be increased after the variable is written in the critical section? I don’t know when to use DSB, ISB, etc. instructions
Thank you very much.
The reason the critical section is used is for portability. If OSTime is declared as a 32 bit value but the code runs on an 8 or 16 bit CPU then the read operation would be performed in multiple steps by the CPU and thus, the critical section protects the value in case the API is called JUST as OSTime is in the middle of being updated. Of course, on a 32 bit CPU, this would not be a problem but as a developer of software that must run on multiple platforms, one must consider this case.
Same reason as question 1. Of course, not an issue for a 32-bit 'var' on a 32 bit CPU.
I'm not sure how to answer this question.
OK,Thank you for your wonderful and authoritative answer, which solved my confusion, thank you again!