多线程
文章平均质量分 52
dancebit
我若成魔 佛奈我何
展开
-
C - 栈操作
在不同的编译平台,对栈的汇编操作有所不同,windows平台volatile int* p = context->stack + context->stack_size / 4;__asm mov esp, p操作很方便,变量可直接传过去keil平台Cortex-M4int n = (int)&sp_buff+4*512; __asm volatile("msr msp, n");参数n也可以直接给,测试有效GCC编译Coretx-M4#def原创 2022-01-03 16:01:46 · 518 阅读 · 0 评论 -
C 伪线程四 - 线程及独立栈实现
接上文,已经验证可以自己定义栈空间了,那么这次移入到伪线程中setjmp longjmp两个函数是能够保存会恢复栈的。所以只需要在启动的第一次配置好伪线程栈的地址即可。当退出伪线程后,恢复主栈地址即可。上面这一切也是个人设想,没依据调度器void TaskScheduler(){ if (context_head == NULL) { return;//没有线程 } if (setjmp(SchedulerStack) == 0) //压入退出时的栈 { .原创 2021-12-30 18:00:46 · 708 阅读 · 0 评论 -
C 伪线程三 - 自定义栈地址
接上文,据我猜测,如果栈可以自己定义地址,每个线程设置不同的栈空间,那么伪线程的局部变量也将是安全的,不会被其他线程覆盖,所以。。。。测试代码uint32_t stack[500]; //自定义堆栈地址int test_fun(int param){ volatile int buff[20] = { 1, 2, 3, 4, 5, 6, 7, 8 }; return 9;}int fn(){ __asm { mov eax, esp //当前栈位置保存起来 lea原创 2021-12-30 16:34:31 · 512 阅读 · 0 评论 -
C 伪线程一 - setjmp longjmp 验证
需求来源于困难,在单片机上我们一般都是跑逻裸机,主要就是单线程加中断的方式写代码。我个人很不喜欢用状态机的方式写代码,会很多的状态变量和全局参数。但是我在一些场合遇到了不得不用状态机的时候,我写起来又不想又很多的全局变量,还希望代码模块化。到最后把我自己的代码眶的超难受。所以就萌生了伪多线程的需求。之前就知道 setjmp longjmp两个函数可以实现函数间跳转,所以便尝试研究起来。测试一、3个任务成环#include "stdio.h"#include &l...原创 2021-12-29 17:54:22 · 484 阅读 · 0 评论 -
C 伪线程二 - setjmp longjmp 实践
上一章节,拿出一个线程来开口子,就是不希望因为线程占用了全部CPU,其他不被线约束的程序照常进行。只要从周期调用线程调度就可以,这是本次设计的基本要求。原创 2021-12-30 10:34:48 · 544 阅读 · 0 评论