使用C对多线程PIC18(Multithreading using C on PIC18)

2019-09-01 05:18发布

怎样才能创造,在编程时并行运行的线程PIC18 ,因为没有操作系统?

Answer 1:

不要使用线程,使用一个事件循环。

PIC18是小型处理器和一个事件循环,基于风格意味着你不必把许多人深栈游逛。 你需要编写代码的事件循环的条件,但是这可能是合理的。

如果你有一些长期运行的任务,使用计时器是不同的中断优先级,以允许更高优先级事件循环,以抢占低优先级事件循环,并提出适当的工种到合适的事件队列。



Answer 2:

你可以尝试合作的多任务处理 。

对于类型的太平洋岛国解决问题,你可能是,如果你尝试使用中断或轮询,而不是多线程的不同设计的更好。



Answer 3:

你可以把一个RTOS上有(有一个非官方的UCO端口 ,或者你可以检查出FreeRTOS操作系统的PIC18端口 )。

否则,你可以尝试实现用C协程使用setjmplongjmp



Answer 4:

如果没有操作系统的一切,你会(显然)必须自己重新创建必要的功能。

跟着很可能是安装一个定时器中断,在一些合适的频率下运行的最简单的方法(可能取决于你的实际的时钟速度,但也许范围100-1000赫兹)。 在中断处理程序,您需要检查当前线程的状态,并决定是否应该进行切换。

诀窍是那么如果有必要作出这样的转变,并从中断处理程序返回到一个不同的线程

当然,得到这个工作时,线程本身可能使用中断,亦未必容易。

你也可以考虑安装一些内核,也许是半自助旅游旅行社 。

这里是“protothreads”为PIC18的一个例子,看起来像的代码的合理量。 不能确定的语义,虽然。

更新 :这可能会要求你做一些汇编最低级别的代码(我不知道,也没有在C对PIC的工作,所以我不知道你到底有多少控制得到)。 你将需要在寄存器控制程序计数器,而那些是不是C概念。



Answer 5:

要知道,在微控制器,一些“线索”也可以通过只是一些特定中断处理程序进行处理,因而在“平行”到你的主事件循环运行反正。

例如,如果你有一个外部事件触发ADC转换,您ADC转换,完成处理程序可以采取的值,做了一些计算,然后设置一些输出位根据ADC值相适应的控制输出。 所有这一切可以在中断处理程序发生,从而平行于一切。

根据你需要同时做的事情,你可以选择多种技术的组合,使并行工作的东西如预期。



Answer 6:

你可能想看看这篇文章从嵌入式系统编程: 建立一个超级简单的塔斯克



Answer 7:

CCS编译包括RTOS。 我没有用它,但是从手工编译 :

CCS的实时操作系统(RTOS)允许PIC微控制器,而不需要中断运行计划任务。 这通过充当调度器的功能(RTOS_RUN())来完成。 当任务被调度运行,调度功能使处理器到任务控制。 当任务执行完毕或者不需要处理器了,该处理器的控制返回到调度功能,那么将会给处理器到计划在适当的时间执行下一个任务的控制。 这个过程被称为协同多任务处理。

警告只是一个字 - 检查他们的论坛,你要寻找的特定功能的信息。 显然,CCS有推出新功能的他们完全测试前的习惯。 这就是我现在还在使用旧版本(v3.249)的原因之一。



Answer 8:

在8051,我用一个简单的堆叠交换机进行双重任务。 我希望同样可以在PIC来完成,只要每个任务只使用16层堆栈。 该代码会是这样的(假设_altSP在普通银行)

_InitTask2:
    movff _STKPTR,_altSP
    movlw 16
    movwf _STKPTR,c
    goto _Task2Start

_TaskSwitch:
    movf  _altSP,w,c
    movff _STKPTR,_altSP
    movwf _STKPTR,c
    return

主要任务应该调用_InitTask2启动第二个任务。 第二个任务将运行至调用_TaskSwitch,于是主要任务将恢复调用_InitTask2指令以下执行。 从那里往前,每一个任务调用_TaskSwitch时间,其他的任务将恢复从去年叫_TaskSwitch的地方执行。

如果你使用这种方法,你的编译器将必须被告知所有的寄存器可以通过调用_InitTask2或_TaskSwitch被丢弃。 它也将被告知,_Task2Start和它调用的函数必须从主要任务分配独立的变量空间。

我不知道你需要告诉编译器,使其快乐是什么,但我会说,合作的双重任务可以做一些事情的工作真的很好。



Answer 9:

我想和大家分享我的C语言编程的小内核来管理微控制器的任务。 您可以创建一个任务有一个时期,暂停,恢复和随时更改一个时期的任务。 这个内核可以删除所有的任务,因为你要创建另一个序。 一个TickGet功能是供给由内核要管理所有的计时器。 你必须只创建一个中断功能和替代功能定时器()来获取你的小内核为自己的应用程序。 要恢复这个内核是基于循环链表上,以打开任务的任务。 这是自愿写在一个普通的方式来帮助人们定义为他们拥有的应用程序。 这里就像是一个循环任务调度任务之间没有优先级。 我在尊重的MISRA准则(汽车标准)写了这个源代码可以下载它在这里

我希望能帮助人们来管理微控制器的任务。



Answer 10:

这确实是非常的事,任务环,以及任务的规定优先级,而我喜欢打破了长期运行的功能,成片的简单的编码是什么。

http://www.mculabs.com/drivers/qtask.html



Answer 11:

我同意NDIM - 你能想到的每一个中断处理程序的,就像这样一个“线程”。 有时候,你需要做的可以通过外部和内部事件触发的中断处理程序进行处理的任务 - “主循环”是一个空闲循环,什么也不做。

我不知道在哪里一些评论者的想法,有“无操作系统”为PIC18。 有相当多的具体的PIC-多线程库和“多任务操作系统内核”为PIC18,其中很多是免费和开源。 见PICList:“PIC单片机特定的多任务的方法” 。



Answer 12:

我这样做(严格地说在固定的调用堆栈深度合作多任务)。

它的工作原理,但海泰克-C编译器的工作对我 - 它重用临时变量的存储位置,从它认为不会在同一时间运行的功能。 基本上边线腐败彼此。 如果我想出解决的办法,我会更新这个答案示例代码。



Answer 13:

Protothreads库是多任务,跨平台的简单方法: http://dunkels.com/adam/pt/

最小的调度器用于与任务同步,计时器和用户数据PT的一个例子: https://github.com/edartuz/c-ptx



文章来源: Multithreading using C on PIC18