12501|28

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

C语言怎么实现多任务的? [复制链接]

用习惯了汇编的时间片轮,突然想起来,C怎么实现的呢?
要求不多高,假如按键,LED,数码管,红外解码要求同时处理
怎么解决这个问题的?继续在中断设标志然后片轮任务吗?
还是说有什么好的解决办法呢?
单片机而已,没有操作系统的任务调配。
请指教一下,thx。
此帖出自编程基础论坛

最新回复

另外我想说的是 假如你只是想 解决 这种 按键 数码管 或者 12864 等显示 的 时间错开 问题 ——其实更专业点应该说是 平衡不同数量级操作时间 的 任务,其实有更加简单的办法。 那就是不要再函数里用大量的 直接 delay延时,而是把 函数执行的行为拆散,然后分步执行函数——就是函数每次调用也许只执行其中的一两个动作,用其他函数的运行时间 来 代替延迟。 这是我过去在无os环境下(确切的说,无多任务机制环境下)大量使用的方法。 它对于一般的情形——比如你提到这种,实在属于很一般的简单情形,相当有用,可以避免 使用复杂的 os. 当然,这会让每个任务写起来相对要费点劲。 ——这里我也是慢慢才体会到,这其实是一种 费劲 的 转移。 如果我们采用os等多任务机制,我们会把几乎所有这种费劲的努力都转移到 os的实现或者移植上,而单独每个任务实现起来则会相对简单许多。 但是,如果我们不使用os,则几乎把这种费劲全数转移到 每个单独的人任务上来,甚至是每个任务都的来一次。 当然,这两者并不存在绝对优劣之分。 比如当情形不是太复杂时,每个任务都来一遍又如何? 毕竟引入os可实在是相当复杂。 特别是 对 空间资源,运行时间的巨大影响~~   详情 回复 发表于 2015-2-3 00:27
点赞 关注
 

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
再怎么也得系统支持咯。
自己做个时间片轮询吧
此帖出自编程基础论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
和语言无关,
此帖出自编程基础论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
自己规划一下功能:
按键,LED,数码管,红外解码要求同时处理

像这样的,先分开时间相关的,再找出实时性要求高的,然后归类
按键,数码管----这几种都可以实时去扫对吧??
那就在实时中断里,例:
if (100毫秒)
{
    //按键
}
if (20毫秒)
{
    //数码管
}

LED----这就只一个简单的开关,任意吧,有需要就打开或关就完了

红外解码--这个要求实时性高,就放在中断里.

主程序就去以应用的逻辑协调这些功能就OK了
此帖出自编程基础论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
LZ觉得八位机有必要上OS吗?

如果仅有一个调度内核,你会在应用上使用吗??
此帖出自编程基础论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
没有操作系统就没有多任务的概念在。
不过你的要求也容易,设置好中断函数,然后在一个死循环里轮询各种事件并处理就行了。
此帖出自编程基础论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
不就成了个简单的调度程序啦——OS的雏形啦!
此帖出自编程基础论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
现在有很多8位机上的OS,ucos也有支持51的,可以参考一下。
此帖出自编程基础论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
简单点说,弄个死循环。。里面喜欢怎么分配你就怎么分配
复杂点说,自己读读哪些RTOS吧。。。
此帖出自编程基础论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
循环扫描
switch()
{
    。。。
}
此帖出自编程基础论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

11
 
无聊..
此帖出自编程基础论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

12
 
没有OS应该很难吧?
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

13
 

回复 楼主 ccxida 的帖子

用不着玩 操作系统 那么复杂。

就你这个要求而言,可以这么玩。

用一个定时器,植一个全局定时变量,它就是你的系统时间。

你不是要时间片么?
它就是你的时间片——比如说,定时一次十个毫秒,你的时间片要多少个十毫秒都可以。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

14
 
c语言任务调度实现还是得回归到CPU硬件操作,回归到汇编。调度策略应该除了时间轮片,应该还有多种调度标准,最基础的先来先服务,短作业优先,优先级,多级反馈等,不是么
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

15
 
本来以为找到一个新的帖子,没想到三年前我自己也掺合了一脚。
不知道楼主还在不在。不过现在对于这个话题,偶又多了一些可唠叨的。
就一一唠叨唠叨吧。

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

16
 
关于 如何实现多任务 这个问题
我三年前的回答,以及这个楼里的很多回答,我发现很可能都只看到了 任务机制 的一个方面,而没看到其他的方面。

我们一直只关注到如何实现 “任务轮询执行” 而已。
这当然是一个非常重要的方面。
实现起来也不复杂,也就是一个 定时中断而已,定时中断加个状态机。

然而,最近我接触了一个使用rtx操作系统的工作任务,虽然并不需要我去直接使用rtx,但是我间接接触了操作系统地工作方式。
并且发现了一些虽然不多但是很关键的特性。
比如说,rtx的任务函数,我无意发现,它原来并不是“被反复调用”,而是不调用不运行时,就直接卡在那个地方,继续调用时,它就
从卡主的地方继续执行!

这个细节,也许您觉得不重要,事实上,错了,它非常重要,真的非常重要!!
因为正是这个特性细节,让它成其为 任务,而非 只是一个反复轮询调用的函数而已。

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

17
 
让我们来看 这个细节的区别在哪里。

我们来看普通裸机程序里的 几种不同“函数类型”

1.普通执行函数,它们(在大体上)是普通的顺序执行,也就是一个函数从头执行到尾,然后就跑了,得到的结果直接通过数组传出或者返回值,它们的效果立马呈现,无需任何前后状态或者数值作为依据。

这是一种非常理想的函数,如果这世界上的所有程序都可以仅仅由它们构成,我相信我们程序员的日子会好过太多太多。

可惜,很多时候,程序要处理很多 异步动作。
这个时候,我们的程序就不能顺序执行到完成再退出。因为每个函数很可能要在不断地反复调用到一定次数后,才可以完成所有功能。
这种函数,和第一种函数相比,最痛苦的地方就在于
因为你的动作是分步骤完成的,它们是在不同调用的时候被依次启动某些动作,因此,你需要 保持数据每个时刻的数值和记录一些状态。
虽然名字不同,但这种情况下它门的作用和我们经常开口闭口说的堆栈,其实是类似的,只可惜,这次,再也没有编译器为我们完成而是要我们自己的程序来处理了。

3.main() ——主函数。
很可惜,前面的第二种函数还有另一种麻烦。
那就是往往一个动作一个功能,不只是有哪些需要反复调用的部分,还有每个阶段开始的时候的初始化以及结束时候的清理动作。
如果我们是在写 c++ java这种函数的时候还是比较爽的,因为它有构造函数和析构函数,虽然和我们讨论的不完全是一回事,但是,基本上它们还是很容易变成某种 语言级的 初始化和清理 支持。

这个时候我们会想起main函数,它真的太爽了。
因为它是程序开始执行的入口(当然是C语言语法层次),也就是说我们不需要太费劲(其实严格来说就是不让她退出就是了)。
我们就可以很熟悉很自然地在main里,首先完成初始化,然后一个while调用。
可惜这样的函数只有一个
你也许会说中断

可惜不好意思,在你不人为加点程序代码的情况下,每次中断函数都是会被全部执行一遍,而不像main函数一样,只被执行一次。
——我的意思是,除了main函数,我们所写的任何函数,都不可能给我们提供一个 ”不从头开始执行“的机会,我们无法区分 初始化这些一次性执行的动作 和 不断死循环执行的动作。

说到这里,我相信,你已经明白我为什么在这个场合提到这堆议论了。

任务机制提供的任务函数,在形式上,或者至少在我们的操作系统层面上,它就仿佛提供了我们写任意多个main函数的可能性!!

这当然非常重要,它可以让我们不去考虑复杂的 数据和标志 的保护,以及不同独立任务之间的耦合 等复杂管理工作,而只专注于我们真正要实现的任务本身。

有时候我觉得,这几乎等于 软实现多核并行。


此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

18
 
至于说到实现,我只能说我失败了。

我和这贴里的一些人一样
——也很不想单单为了一个任务机制就去使用一个操作系统。
那样平白无故把事情搞复杂了。

我曾很天真的试图利用函数指针放在定时中断里完成该功能,可惜我发现那是不可能的——很多时候,通过函数指针调用函数和直接调用函数,至少在我想到的方案里是没区别的。

所以后来我又试图直接去参考OS的系统看看人家怎么实现。
后来我发现那些OS看起来太痛苦了,我也可耻的闪了。

后来我最后一个努力是 我找到 lwip作者adam 写的一个 pthread 独立多线程实现代码。
可惜我最后一层一层剥掉那些宏以后,我发现,它通过宏的形式,本质上不是真正意义上的任务机制,而是靠一些变量的手段跳出来。

那么也就是说实际上,这个实现,还是逃不了我们自己以前那些实现所带有的麻烦,只不过它把一切掩埋在那套精巧复杂的宏里。
——我个人偏喜欢函数形式组织的程序,而不是宏——因为很多时候那都是一些”障眼法“。

另外,adam的这个pthread它不支持任务带独立的存储空间,这个是很麻烦的。

所以我也放弃了。

这事儿到这我也灰心丧气了。心想,下次再倒腾就两个路子
要么接受这种adam的宏形式——也许它并没有我想象的那么那啥。毕竟有一些操作系统也是用这类简单的任务机制,比如同样出自这个adam之手的操作系统 contiki
第二,我正儿八经去研究一个操作系统是如何实现的。

然而,前阵子,我无意在图书馆找书时,看到一本老外写的 arm cortex m3的书,我翻过目录,里面似乎提到如何实现这种任务机制——当然也许是在汇编的层次上。

事实上,我在上面的各种尝试之后,我也是隐隐感觉,也许纯c语法无法实现?
——当然呵呵,这个我还没多看,不敢乱说,大家别打我呀~~~
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

19
 
辛昕 发表于 2014-5-2 23:07
关于 如何实现多任务 这个问题
我三年前的回答,以及这个楼里的很多回答,我发现很可能都只看到了 任务机 ...

对于操作系统我只看过Ucos,所以版主的一些理念还不太明白。但我知道对于(多任务)操作系统本质就是中断,对于DOS、ucos、windows、Linux、vworks......本质上是一样,只是细节上的不同而已,或者说针对不同目的,而采取了不同的中断策略。操作系统实现了对CPU环境的偷梁换柱,从而让函数、任务发生跳转,然而如何偷如何换,不同的偷换机制,成就不同的操作系统,也完成了不同的目的。这样理解对么?版主所说的“我无意发现,它原来并不是“被反复调用”,而是不调用不运行时,就直接卡在那个地方,继续调用时,它就从卡住的地方继续执行!”,“卡在那里”是指被“被中断”么?“从卡住的地方继续执行”是指“中断返回”么?



此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

20
 
yunfenglw 发表于 2014-5-3 09:39
对于操作系统我只看过Ucos,所以版主的一些理念还不太明白。但我知道对于(多任务)操作系统本质就是中断 ...

这和中断不中断没什么关系
我意思是 它的任务函数从来没有被退出过,也不是靠反复调用来实现的,
这才是让我好奇和不知道如何实现的地方

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表