一、中断服务程序
中断服务程序主要用来处理来自硬件的中断,毋庸置疑,它是嵌入式程序的重要组成部分。而关于中断服务程序的一些注意事项,虽然已经是老生常谈的问题,但本人还是想简单为自己总结一下,也希望给大家一些参考。
首先,中断服务程序中哪些不可以做。
1. 不能使用printf,可用logMsg代替。
2. 不能使用free,malloc也就意味着也不能是用C++的new,delete操作符
3. 不能调用任何阻塞的处理,比如semTake,taskDelay等
4. 不能进行请求处理任务上下文的操作,不能使用0作为任务id,比如调用taskSuspend(0)
5. 不能使用互斥信号量,因为其中使用了taskSafe和taskUnsafe
6. 不能使用系统的IO调用,包括写操作
7. 尽量不进行浮点运算处理,如果要进行浮点运算,必须显式的保存或回复FP寄存器(fppArchLib)。
那么,中断服务程序中哪些可以或者应该去做呢。
1. 对二值或者计数信号量,可以调用semGive或semFlush
2. 可以对内存进行读或写操作,包括对映射内存的访问
3. 可以对非阻塞操作的管道或者消息队列进行写操作
4. 可以使用taskSuspend,taskResume等
5. 处理尽量短小,最理想的处理是只包含semGive处理,把其他处理放在中断服务任务中处理
虽然每条都很显而易见,但有时还是容易会忽略个别,所以还是罗列了下,可以作为checklist帮助检查。
————————————————
版权声明:本文为CSDN博主「MU_SZ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/my_business/article/details/9291877
2、中断服务程序,不能用的函数:prinf malloc semTake(信号量获取) usleep
3、信号的回调不能返回:SIGSEGV SIGINT SIGBUS。 (SIGPIPE SIGFPE 不是)
二、
互斥
互相排斥(mutex exclusion)技术,简称为互斥(mutex),它用于防止多个线程同时访问共享资源。互斥技术采用一个对象控制独占访问权限,该对象称之为互斥。配合条件变量(condition variable),互斥可以实现广泛的同步访问控制。例如,它们允许程序员为数据访问操作指定执行次序。
在 C 程序中,一个互斥采用类型为 mtx_t 的对象表示,它能在一段时间内被一个线程锁定,而其他线程必须等待,直到它被解锁。在头文件 threads.h 中,包括了关于互斥操作的所有声明。最重要的互斥函数有:
三、多线程
哪些库函数,在多线程调用时可能会导致数据竞争。
四、volatile变量使用场景:中断服务程2序中修1改供其他程 1序检测的变量; 多任务环1境个任1务间共1享的标1志;存储器映射的硬件寄存器变量;(频1繁调1用的子1函数内部)
五、linux用户态间进程切换,需要更新MMU page table映射寄存器
六、多线程调用可能会导致数据竞争:strtok strerror asctime streeor_r rand
微处理器常见指令架构:
CISC负责 RISC精简指令 EPIC显示并行 VLIW超长指令字