建设一个网站选择的服务器,办一个购物网站要多少钱,手机做电商怎么赚钱,php网站开发哪个好切换线程时需要保存什么
函数需要保存吗#xff1f;函数在Flash上#xff0c;不会被破坏#xff0c;无需保存。函数执行到了哪里#xff1f;需要保存吗#xff1f;需要保存。全局变量需要保存吗#xff1f;全局变量在内存上#xff0c;无需保存。局部变量需要保存吗函数在Flash上不会被破坏无需保存。函数执行到了哪里需要保存吗需要保存。全局变量需要保存吗全局变量在内存上无需保存。局部变量需要保存吗局部变量在栈里也是在内存里只要避免栈不会被破坏即可局部变量无需保存。运算的中间值需要保存吗中间值保存在CPU寄存器里另一个线程也需要用到寄存器所以CPU寄存器要保存。函数运行到了哪里也是一个CPU寄存器名为“PC”。
总结CPU寄存器需要保存保存在线程的栈里。
ARM架构
ARM芯片属于精简指令计算机RISCReduced Instruction Set Computor它所用的指令比较简单有如下特点
对内存只有读、写指令。对于数据的运算都是在CPU内部实现。使用RISC指令的CPU复杂度小一点易于设计。 几条汇编指令
读内存指令LDR即Load之意。写内存指令STR即Store之意。加减指令ADD、SUB跳转BLBranch And Link入栈指令PUSH出栈指令POP
加载指令LDRLDR r0,[addrA]意思是将地址addrA的内容加载到r0里面。 存储指令STRSTR r0,[addr A]把r0的值存储到地址addrA上。 加法运算指令ADDADD r0,r1,r2意思为r0r1r2。 减法运算指令SUBSUB r0,r1,r2意思为r0r1-r2。 寄存器入栈/出栈指令PUSH/POP
寄存器入栈PUSHPUSH {r3, lr}意思是将寄存器r3和lr写入内存栈。
本质是写内存STR指令高标号寄存器写入高地址的栈里低标号寄存器写入低地址的栈里。lr即r14写入地址为sp-4的内存然后spsp-4。r3写入地址为sp-4的内存然后spsp-4。
寄存器出栈指令POPPOP {r3,pc}意思是取出内存栈的数据放入r3和pc中。
本质是读内存LDR指令高标号寄存器的内容来自高地址的栈低标号寄存器的内容来自低地址的栈。读地址为sp的内容存入r3然后spsp4。读地址为sp的内容存入pc然后spsp4。
寄存器别名 PUSH指令多次调用STR指令并且会调整SP的值。
BL A会记录返回地址保存在R14里然后跳转到A执行执行完后PC会跳转到R14所指向的地址。 初始化栈
IPC
引入IPC主要是为了两项功能
线程间互斥休眠-唤醒机制
队列 队列里有多个消息块消息块里面可以存储消息数据每个消息块大小相同。
队列里有两个链表Sender List、Receiver List。 挂起线程也就是将线程从就绪链表中移出。 再将线程挂到队列的等待链表中。 启动定时器。
互斥量如何实现
对于互斥变量a
关中断汇编指令原子地修改a
IPC 消息队列的读取都是使用memcpy()。
邮箱的读取直接赋值即可。 链表、定时器、环形缓冲区读、写位置
信号量的缺点
谁都可以释放信号量优先级反转
Mutex解决
谁拥有谁释放优先级继承
一个互斥量可以被同一个线程多次take
信号不是信号量是一种异步通知机制。 **信号就是线程的软件中断。 **
信号处理流程
信号就是线程的“软件中断”跟“硬件中断”类似 要安装信号处理函数相当于给硬件中断提供处理函数。
/* thread1 安装信号自定义处理函数 */rt_signal_install(SIGUSR1, thread1_signal_handler);/* thread1 要使能信号相当于使能硬件中断解除屏蔽 */
rt_signal_unmask(SIGUSR1);/* 向thread1发出信号相当于触发硬件中断 */
rt_thread_kill(thread1, SIGUSR1);什么是块设备
有存储功能写入数据到pos位置再读pos可以得到一样的数据。 数据的传输单位是扇区。
挂载
挂载点path 文件系统 块设备