搜索
bottom↓
回复: 63

新唐M051很火啊,呵呵,上传移植到MO51开发板的TinyThread

[复制链接]

出0入0汤圆

发表于 2010-10-19 09:43:04 | 显示全部楼层 |阅读模式
注意:非本人原创,作者应该是X-Hawk大侠,链接如下,只不过原来是针对NUC1xx系列的,我把拿到的M051开发板的库文件替换了一下,稍微整理了一下,运行两个进程,串口接收到数据后会再上传,供大家参考。开发板就是展会上发的那款,只不过我们是花180买的-_-!

因为M051没有内置RTC,所以以后要做DS1302之类的RTC芯片,还没做M051的I2C,有做过的大侠可以加上,另外不知道FFXZ老大什么时候在RT-Thread也加上M051系列啊?使用过程中感觉有点放不开,稍微一不注意内存就溢出了,不如STM32的内存爽。


------需要修改的地方-------------------------------------
tt_syscall.s 中要修改:

开始加上:

    PRESERVE8
; Vector Table Mapped to Address 0 at Reset
                AREA    |.text|, CODE, READONLY



最后的END前面加上  ALIGN!

GPIOB等换成E_PORT1;

去掉linker里的ScatterFile;

Misc controls里改成:--entry Reset_Handler
--------------------------------------------------------------
TinyThread  :http://code.google.com/p/tinythread/

点击此处下载 ourdev_591004DKIEK2.rar(文件大小:803K) (原文件名:M051移植 TinyThread_1.0.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入85汤圆

发表于 2010-10-19 10:13:21 | 显示全部楼层
支持,有空我也玩玩

出0入0汤圆

发表于 2010-10-19 10:15:05 | 显示全部楼层
到人手一块的话,我想会更火的,到时候会不会也拿不到货呢?

出0入0汤圆

发表于 2010-10-19 10:20:50 | 显示全部楼层
顶啊
没有开发板只有眼馋的事情了。。。。。。。。。

出0入0汤圆

发表于 2010-10-19 10:24:27 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-19 17:33:55 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-11-2 19:22:58 | 显示全部楼层
---------------------------------------
以下内容转自X-Hawk大侠博客:http://blog.chinaunix.net/u3/112389/showart.php?id=2204038
---------------------------------------

姑且妄称为OS吧,其实就是一个线程切换,与Novoton的NUC1xx系列芯片(Cortex M0内核)无缝整合。


主要特点:
1. 代码很小,可以在4K之内实现多线程
2. 抢占式任务切换。
3. 支持10级优先级,优先级动态可调整。
4. 支持semaphore, recursive mutex(递归锁), condition变量等
5. mutex可以对付优先级反转问题
6. 静态内存设计,完全无动态分配,也不需要预先多分配内存。

出0入0汤圆

发表于 2010-11-2 19:29:41 | 显示全部楼层
/* SYSCLK =>12Mhz*/
        UNLOCKREG();
         SYSCLK->PWRCON.XTL12M_EN = 1;
        LOCKREG();

上面這兩個UNLOCKREG()和LOCKREG()函數,為啥找不到原型,它是KEIL提供的還是Novoton提供的? 原型在啥地方?

出0入0汤圆

发表于 2010-11-3 08:55:35 | 显示全部楼层
试了TinyThread

有一问题:
节拍10ms空跑可以运行,2ms空跑不能运行,系统会占用这么大资源吗???

出0入0汤圆

发表于 2010-11-3 09:02:37 | 显示全部楼层
新唐M0最近是很火,确切地说是申请芯片的很恼火,代理们把用户信息套到手后就不吭声了。像“威X特”之流说什么十一后,现在都十

一月份了。。。。。。。。。。。

出0入0汤圆

发表于 2010-11-3 09:20:40 | 显示全部楼层
回复【3楼】wanyou132 白水
顶啊
没有开发板只有眼馋的事情了。。。。。。。。。
-----------------------------------------------------------------------

上次申请,没下文了,只能看看了~
围观~

出0入0汤圆

发表于 2010-11-3 11:02:21 | 显示全部楼层
大中科技专业一级合理新唐M0,个人的话最好还是订购不会有那么多麻烦,公司的话样品送一二P也没什么大问题,毕竟代理也不容易QQ450766221,有些地方还请理解

出0入0汤圆

发表于 2010-11-6 14:52:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-6 16:12:06 | 显示全部楼层
我有新唐送的两片 排针焊好了  但最近学习比较紧 没时间玩 谁需要的话可以先借去用 估计大四下学期还回来就可以了   但最好能在西安 我这的快递死贵死贵的

出0入0汤圆

发表于 2010-11-18 23:12:42 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-11-19 11:10:01 | 显示全部楼层
好东西

出0入0汤圆

发表于 2010-11-22 09:26:35 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-12-13 18:26:34 | 显示全部楼层
回复【9楼】sde_arm9  
试了tinythread
有一问题:
节拍10ms空跑可以运行,2ms空跑不能运行,系统会占用这么大资源吗???
-----------------------------------------------------------------------

昨天测试下线程调度花费的CPU cycle,
大约在300个cycle左右,跟Keil RTX差不多。再优化也比较难了。

默认情况下,跑22M的时钟,设定每秒512个节拍(相当于2ms),
跑起来很顺畅,没问题的。

如果默认时钟设定不是22M, 比如是10K, 2ms一个调度,当真没法跑了。

出0入0汤圆

发表于 2010-12-13 18:41:16 | 显示全部楼层
另:感谢楼主,俺将M051的支持合并进来了,代码放在:
http://code.google.com/p/tinythread/

这版同时支持NUC100,M051系列,
支持IAR和Keil环境。

为了测试在小内存情况下,多线程的运行状况,
新增一个极小内存的例子,跑4个线程,程序大小:
Keil程序:
  Program Size: Code=1076 RO-data=224 RW-data=48 ZI-data=776  
IAR程序:
  1 434 bytes of readonly  code memory
     40 bytes of readonly  data memory
    824 bytes of readwrite data memory

内存空间主要被stack占据:
  主线程stack:128字节
  其他3个线程stack:142字节*3
  中断stack: 128字节
stack共计:682字节
程序要是不用堆栈就好了啊,哈哈

出0入0汤圆

发表于 2010-12-13 21:29:58 | 显示全部楼层
TinyThread  相比ucos  有何优势?

出0入0汤圆

发表于 2010-12-13 22:14:47 | 显示全部楼层
回复【21楼】ljt8015  
tinythread  相比ucos  有何优势?
-----------------------------------------------------------------------

没有玩过ucos, 只能从一些公开的文档和道听途说上比较一下,
说错的地方,请各位指正:

1. 优先级和时间片轮转调度
   TinyThread不同的线程可以有相同的优先级,
   相同优先级的线程之间,通过时间片轮转调度。
   ucos则强制要求各任务优先级不同。

2. 优先级反转
   TinyThread的锁对象(mutex), 通过自动优先级继承的办法,
   解决优先级反转的问题。
   ucos无法对抗优先级反转,要求用户很小心的构建代码,才能避免不同线程之间因为反转造成系统死掉。

3. TinyThread支持递归锁,
   支持条件同步函数,
   类似于pthread的pthread_cond_wait, pthread_cond_signal, pthread_cond_broadcast函数,
   TinyThread也有 tt_cond_wait, tt_cond_signal, tt_cond_broadcast
   ucos没有查到资料,请懂的人帮忙说说。

还有TinyThread占用内存少,绝对不需要动态内存分配等,估计ucos也不会差。

出0入0汤圆

发表于 2010-12-13 22:41:26 | 显示全部楼层
jh

出0入0汤圆

发表于 2010-12-13 22:44:26 | 显示全部楼层
ucos的信号量创建函数,
   OS_EVENT *OSSemCreate(WORD value);
需要预先设定 OS_MAX_EVENTS,
如果预先设定的event不足,则有信号创建失败的风险。


TinyThread的对象,只需要按需定义,比如创建一个信号量
   TT_SEM_T sem;  //sizeof(sem) is 8
   tt_sem_init(&sem, value);
只需要保证sem在使用期间,它占据的这8个字节空间还属于它使用即可。
这样对象占据的空间,始终按需分配,不会多占空间,也不会分配失败。

出0入0汤圆

 楼主| 发表于 2010-12-14 21:30:01 | 显示全部楼层
呵呵,看到陈先生亲自来解惑甚是高兴,顺便把您的TinyThread V1.1放上来。
我觉得TinyThread最大的好处就是短小精悍、占用内存少,配合M052系列来用很合适。

另:刚发现7z的压缩效率是如此之高啊,没办法,论坛不支持,转成RAR的了。

点击此处下载 ourdev_604680CQE0LV.rar(文件大小:689K) (原文件名:TinyThread_1.1.rar)

出0入0汤圆

发表于 2010-12-14 21:55:14 | 显示全部楼层
路过

出0入0汤圆

 楼主| 发表于 2010-12-15 08:23:01 | 显示全部楼层
刚才试了一下sample里的例子,编译完后有两个警告:

..\..\..\Src\tt_sys_keil.s(174): warning: A1581W: Added 2 bytes of padding at address 0x76


.\obj\output.axf: Warning: L6306W: '~PRES8' section tt_sys_keil.o(.text) should not use the address of 'REQ8' function __tt_on_timer.

大家编译完后有这个现象吗?

出0入0汤圆

 楼主| 发表于 2010-12-15 08:31:35 | 显示全部楼层
呵呵,搞定,还是老方法:


------需要修改的地方-------------------------------------
tt_sys_keil.s 中要修改:

开始加上:   PRESERVE8


最后的END前面加上  ALIGN!

出0入0汤圆

发表于 2010-12-23 09:53:33 | 显示全部楼层
回复【10楼】pcra_ck
-----------------------------------------------------------------------
兄弟 不好意思!可能是申请的人比较多,公司统一审核的,如果没拿到样品,可以直接电话我.
我们最近在深圳有一个MO培训,如果有兴趣可以过来坐下。

出0入0汤圆

发表于 2011-1-6 16:49:52 | 显示全部楼层
Cortex -M0 与M3有什么区别啊~

出0入0汤圆

发表于 2011-1-7 09:20:49 | 显示全部楼层
不错

出0入0汤圆

发表于 2011-1-7 09:27:44 | 显示全部楼层
MARK,最近可能会拿到开发板!

出0入0汤圆

发表于 2011-2-3 15:39:54 | 显示全部楼层
回复【8楼】lm78l05 JimoPanda
/* sysclk =>12mhz*/
unlockreg();
         sysclk->pwrcon.xtl12m_en = 1;
lockreg();
上面這兩個unlockreg()和lockreg()函數,為啥找不到原型,它是keil提供的還是novoton提供的? 原型在啥地方?
-----------------------------------------------------------------------
/*-----------------------------------------------------------------------------
  Function:                Un_Lock_Reg                                                                        
                                                                                                         
  Parameter:                                                                                                                                                                                          
                        None                                    
  Returns:                                                                                                
                       None                                                                                      
  Description:                                                                                            
                       Unlock protected register bits, so as user can access to.                                    
*-----------------------------------------------------------------------------*/
void Un_Lock_Reg(void)
{
    RegLockAddr = 0x59;
    RegLockAddr = 0x16;
    RegLockAddr = 0x88;
}

/*-----------------------------------------------------------------------------
  Function:                Lock_Reg                                                                        
                                                                                                         
  Parameter:                                                                                                                                                                                          
                        None                                    
  Returns:                                                                                                
                       None                                                                                      
  Description:                                                                                            
                       Lock protected register bits, avoiding unknown errors when
                                access illegally.                                    
*-----------------------------------------------------------------------------*/
void Lock_Reg(void)
{
    RegLockAddr = 0x00;
}
common.c 里

出0入0汤圆

发表于 2011-2-3 16:14:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-5 21:47:15 | 显示全部楼层
先谢谢X-Hawk和楼主!
下载了TinyThread 1.1,用uV3.8版本编译了里面的Thread_SmallMemory工程,按楼主在顶楼位的修改方法,可以编译成功且没有warning:

Program Size: Code=1076 RO-data=224 RW-data=48 ZI-data=776  
FromELF: creating hex file...
User command #1: fromelf --bin ".\obj\output.axf" --output ".\obj\output.bin"
User command #2: fromelf --text -c ".\obj\output.axf" --output ".\obj\output.txt"
".\obj\output.axf" - 0 Error(s), 0 Warning(s).

代码的大小和20楼的一致,但是进入仿真,peripherals下拉菜单里面只有core peripherals,含NVIC,Tick Timer和Sys Control & Cfg三项,其它的外设等在菜单里都看不到

不知道大家都用哪个版本的MDK?是不是必须安装uV4?在uV4里面能看到全部的外设吗?
现在我的3.8版本和C51可以相安无事,怕安装新版本会搞乱了,麻烦安装了高版本的朋友帮我确认一下,如果高版本支持M051全部外设仿真我再安装。谢谢了

出0入0汤圆

发表于 2011-2-6 01:48:15 | 显示全部楼层
慎用啊!

出0入0汤圆

发表于 2011-2-6 11:57:54 | 显示全部楼层
回复【36楼】John_Lee
慎用啊!
-----------------------------------------------------------------------

什么意思?没明白,慎用uV3吗?

出0入0汤圆

发表于 2011-2-6 13:43:31 | 显示全部楼层
慎用tinythread,我发现有bug和逻辑错误。如果作者看到此贴,请联系我,我会告诉你错误在哪。

出0入0汤圆

发表于 2011-2-6 13:48:14 | 显示全部楼层
bug很容易修正,但逻辑错误比较麻烦,牵涉范围较大。

出0入0汤圆

发表于 2011-2-6 14:08:06 | 显示全部楼层
哦,谢谢John_Lee,请问您试用tinythread是用MDK吗?如果是uV4的话,请帮助看看simulation时peripherals菜单下面是不是可以看到M051的各种外设?我现在用的是uV3,能编译,但是看不到外设,想确认一下新版本是不是可以,谢谢了

出0入0汤圆

发表于 2011-2-6 15:25:55 | 显示全部楼层
回复【40楼】danju
-----------------------------------------------------------------------


uvision (原文件名:nuvoton.PNG)

出0入0汤圆

发表于 2011-2-6 15:36:44 | 显示全部楼层
回复【41楼】John_Lee

再次感谢!
我用的uV3也是只能看到这三项呢(已安装了新唐的驱动),但是貌似一些帖子里面提到的都是要安装uV4,不知道用uV3是不是也没问题

不能仿真外设,调试就不如C51方便了,没有实物板子是不是就没法玩了呀

我正在看tinythread,有错误的也请指出来,不知道您说的bug和逻辑错误是rtt本身的?还是tinythread简化的时候没注意造成的?

出0入0汤圆

发表于 2011-2-6 16:22:51 | 显示全部楼层
rtt还真没看过,以后有时间去看看,看看能不能也抓个bug出来,tt的问题,从尊重作者的角度考虑,我觉得还是先告诉作者比较好一些。

关于nuvoton的外设调试问题,我觉得应该是nuvoton自己的问题。keil开放了调试器接口agsi,各个芯片厂家应该自己编写芯片的外设(甚至CPU)在运行中行为(当然还包括显示界面),报告给uVision,这样,uVision就可以显示出来了。nuvoton可能自己没有来得及写这个驱动(我瞎猜),keil当然没有办法显示。

出0入0汤圆

发表于 2011-2-11 21:56:45 | 显示全部楼层
嗯,是的,我看了,如果选NXP的M0芯片,是可以看到外设的,新唐怎么就没想到开发者调试方便点呢,期待下一个版本的软件可以支持

出0入0汤圆

发表于 2011-2-12 14:57:01 | 显示全部楼层
【30楼】 dew2901 :Cortex -M0 与M3有什么区别啊~

-------------------------------------------------------------------------

M0和M3比较

M0:
见:http://www.arm.com/products/processors/cortex-m/cortex-m0.php
ARM Cortex™-M0 处理器是现有的最小、能耗最低和能效最高的 ARM 处理器。该处理器硅面积极小、能耗极低并且所需的代码量极少,这使得开发人员能够以 8 位的设备实现 32 位设备的性能,从而省略 16 位设备的研发步骤。Cortex-M0 处理器超低的门数也使得它可以部署在模拟和混合信号设备中。
能耗最低的最小 ARM 处理器
Cortex-M0 的代码密度和能效优势意味着它是各种应用中 8/16 位设备的自然高性价比换代产品,同时保留与功能丰富的 Cortex-M3 处理器的工具和二进制向上兼容性。

超低的能耗
Cortex-M0 处理器在不到 12 K 门的面积内能耗仅有 85 µW/MHz(0.085 毫瓦),所凭借的是作为低能耗技术的领导者和创建超低能耗设备的主要推动者的无与伦比的 ARM 专门技术。

简单
指令只有 56 个,这样您便可以快速掌握整个 Cortex-M0 指令集(如果需要);但其 C 语言友好体系结构意味着这并不是必需的。可供选择的具有完全确定性的指令和中断计时使得计算响应时间十分容易。

优化的连接性
设计为支持低能耗连接,如 Bluetooth Low Energy (BLE)、IEEE 802.15 和 Z-wave,特别是在这样的模拟设备中:这些模拟设备正在增加其数字功能,以有效地预处理和传输数据。

M3:
http://www.arm.com/products/processors/cortex-m/cortex-m3.php
ARM Cortex™- M3 处理器是行业领先的 32 位处理器,适用于具有高确定性的实时应用,已专门开发为允许合作伙伴为范围广泛的设备(包括微控制器、汽车车体系统、工业控制系统以及无线网络和传感器)开发高性能低成本的平台。该处理器提供出色的计算性能和对事件的卓越系统响应,同时可以应对低动态和静态功率限制的挑战。该处理器是高度可配置的,可以支持范围广泛的实现(从那些需要内存保护和强大跟踪技术的实现到那些需要极小面积的对成本非常敏感的设备)。
为什么选择 Cortex-M3
提供更高的性能和更丰富的功能
于 2004 年引进、最近通过新技术进行了更新并更新了可配置性的 Cortex-M3,是专门针对微控制器应用开发的主流 ARM 处理器。

性能和能效
具有高性能和低动态能耗,Cortex-M3 处理器提供领先的功效:在 90nmG 基础上为 12.5 DMIPS/mW。将集成的睡眠模式与可选的状态保留功能相结合,Cortex-M3 处理器确保对于同时需要低能耗和出色性能的应用不存在折衷。

全功能
该处理器执行 Thumb®-2 指令集以获得最佳性能和代码大小,包括硬件除法、单周期乘法和位字段操作。Cortex-M3 NVIC 在设计时是高度可配置的,最多可提供 240 个具有单独优先级、动态重设优先级功能和集成系统时钟的系统中断。

丰富的连接
功能和性能的组合使基于 Cortex-M3 的设备可以有效处理多个 I/O 通道和协议标准,如 USB OTG (On-The-Go)。


cortex-m_performance-zh.png (原文件名:cortex-m_performance-zh.png)

出0入0汤圆

发表于 2011-2-13 08:57:23 | 显示全部楼层
回复【42楼】danju  
回复【41楼】john_lee
再次感谢!
我用的uv3也是只能看到这三项呢(已安装了新唐的驱动),但是貌似一些帖子里面提到的都是要安装uv4,不知道用uv3是不是也没问题
不能仿真外设,调试就不如c51方便了,没有实物板子是不是就没法玩了呀
我正在看tinythread,有错误的也请指出来,不知道您说的bug和逻辑错误是rtt本身的?还是tinythread简化的时候没注意造成的?
-----------------------------------------------------------------------

吓我一跳

出0入0汤圆

发表于 2011-2-13 09:48:31 | 显示全部楼层
呵呵,ffxz大侠也来关注了,可别被我们吓着哦,我前面是因为uv3仿真看不到外设,所以问john_lee uV4是不是能看到,能仿真还是方便些

不过前面他提到TinyThread可能有bug,也请ffxz关注一下,毕竟新唐的M0价格有优势,低端应用还是不错的,能把TinyThread用好的话对于推广rtt也是有利的

出0入0汤圆

发表于 2011-2-14 13:57:53 | 显示全部楼层
John_Lee 兄,我是TinyThread作者。请直接跟贴写出错误,感恩啦。
代码开源的意义,就是要经得起网友的批评指正!

出0入0汤圆

发表于 2011-2-15 01:31:43 | 显示全部楼层
X-Hawk 客气,既然老兄如此坦诚,我也就实话实说了:

一、在 SVC_Handler 函数中,有两处使用了 blx r1 指令,可能有些问题。
ARM 在 Cortex 架构中引入了两种机制,一种称为“late arrival pre-emption”(参见《ARMv6-M Architecture Reference Manual》 B1.5.11),如果在 svc 异常的入栈期间,系统中又发生了更高优先级的中断,那么这个中断会先于 svc 执行;另一种称为“Tail-chaining”(参见《ARMv6-M Architecture Reference Manual》 B1.5.12),当高优先级的中断返回时,CPU 会以 Tail-chaining 方式执行这之前的 svc 异常服务,但此时 r0-r4,r12 寄存器的值很可能已被刚才的高优先级中断服务例程改变。显然,在 svc 异常服务例程中直接 blx r1 是非常不安全的,如果恰巧遇到了上面所说的情况,系统崩溃是必然的。

解决办法有两个:
1、永远使 svc 异常处于最高优先级,弊端是延迟了中断响应。
2、从已入栈的中断上下文中读取 r1 的值。

二、__tt_sem_down 函数:
static void __tt_sem_down (void *arg)
{
  TT_SEM_T *sem = (TT_SEM_T *) arg;

  if (sem->count == 0)
  {
    /* Suspend current thread. */
    TT_THREAD_T *thread = tt_thread_self ();
    listDetach (&thread->list_schedule);
    thread->wait_parent = sem;

    if (sem->locked_thread != NULL)
    {
      /* Append "sem->locked_thread" to the right of "thread" */
      listAttach (&sem->locked_thread->list_schedule, &thread->list_schedule);
    }
    else
    { /******** A ********/
      /* Head thread wait on this semaphore */
      sem->locked_thread = thread;
    }

    __tt_schedule ();
  }
  else
    --sem->count;
}

假设当前的 sem->count 为 0,sem->locked_thread 为 NULL,当运行到 A 点(已判断 locked_thread == NULL,但还未对 locked_thread 赋值)时,系统发生了中断,在中断服务例程中调用了 tt_sem_up() 函数,而在 __tt_sem_up() 里,因为 sem->locked_thread 为 NULL,所以执行了 ++sem->count,此时 count 为 1;当中断返回后,程序从 A 点继续运行,而将当前任务阻塞。

这就造成了一种奇异的现象:sem(信号灯)有可用的资源(count != 0),但却有任务被阻塞在信号灯上了,发生这种事情的原因很简单:本应按原子方式进行的操作,老兄却没有按原子操作。要解决这个问题的方法也有多种,但都不是十全十美的,具体就看老兄处理的策略了。

可能其他文件中也有此类问题,我没有一一查看。只有请 X-hawk 老兄自己检查了。

出0入0汤圆

发表于 2011-2-15 15:52:23 | 显示全部楼层
楼上的两个担忧都完全不存在的,
上班时间不多聊,晚上回来再码字慢慢解释。

出0入0汤圆

发表于 2011-2-15 20:30:31 | 显示全部楼层
1. 首先说Tail-chaining,它说的是这样一种场景,
   未优化情况下,两个异常正常的执行次序六个步骤:
       A:压栈1、异常1、出栈1
       B: 压栈2、异常2、出栈2
   实际上,在某种情况下,那么 出栈1和压栈2的动作是不必要的,
   于是可以优化成四个步骤:
      A:压栈1、异常1、
      B:        异常2、出栈2
   也就是说,Tail-chaining机制,不会对“出栈2”时的寄存器造成任何影响。

上面这段过于迷乱,大家可不看,关键是一句话,
这种优化,不是任何时候都可以的,上面提到“在某种情况下”。
什么情况呢?需要挂起的异常的优先级,比正在前一个异常的优先级高。(在《ARMv6-M Architecture Reference Manual》 B1.5.12有提到)

楼主提到的情况,一个更高优先级的异常过来抢占svc, 然后进svc之前又做tail-chaining。
《ARMv6-M》中的这个要求,正好可以将其避免。
其实它不想办法避免也不行,否则Tail-chaining就几乎是个废材,任何的异常的寄存器都可能被弄乱,不关svc.

2. 关于svc优先级是不是最高。
   svc优先级的确不是最高的。对于M0, 更高的还有reset, nmi, hardfault.
   这三个,是特例,比OS调度更底层的东西。只要用户不在nmi, hardfault异常中写和OS调度相关的代码,
   就永远不会有问题。当然,如果用户硬要写,任何OS都无法避免不出错。

   再则就是svc的优先级,当然用户也可以改掉,变成更低。这是改过才可能有bug,不是吗?总不能阻止用户搞破坏。
   其实改了也关系不大,TinyThread的函数,都是用svc,仿造系统调用的方式实现的。

   再则就是hardfault中断,正常程序,都是由程序主动造成,例如执行BKPT指令。
   运行svc时,不会突然无端冒个hardfault.

   所以svc优先级不是最高的问题,事实上不用担心。

3. 关于__tt_sem_down 函数
   TinyThread暴露给用户的函数,是tt_sem_down(),
   加下划线的static __tt_sem_down()函数,由svc handler里面内部调用。
   因为在svc handler里面调用,这就保证了此函数执行期间,不会有中断进来再执行 tt_sem_up()。
   所以John提到的问题也不存在的。
   当然svc期间,可能有nmi和hardfault, 不需考虑的原因上面讲了。nmi更叫“不可屏蔽中断”,
   用户要在里面“搞破坏”,任何OS都歇菜。

   另外tt_sem_up执行++sem->count的动作,也是在进入svc handler里执行的。在svc里面,down和up的动作不会交错着做。


感谢John_Lee的细致分析,兄弟肯定是软件老大,一口气能发现这么多的疑点。
不过你真的多虑了。上面说一堆,不足之处,请万望指出。


========================================================================
再补充一下,2010年3月的TinyThread1.0的tt_list.h中,处理list时,有个小bug.
在TinyThread1.1中有修复。

出0入0汤圆

发表于 2011-2-15 22:08:12 | 显示全部楼层
回复【51楼】X-Hawk
-----------------------------------------------------------------------

看了老兄的解释,明白了tiny-thread的策略,诚如老兄所说,将svc异常的优先级置为最高,是没有问题的。

但仍然有些问题想与老兄商榷:

首先,tiny-thread没有任何文档说明必须将svc异常优先级设置为最高;难免会让用户设置错误,如果因为这个原因而造成系统崩溃,可能会使用户觉得tiny-thread有问题,如果老兄将再文档完善一下,肯定是有益的。

其次,tiny-thread的这个策略,从运行逻辑上等同于:在进入关键区前先将全局中断关闭,离开关键区时,再恢复中断(类似ucos等大多数OS的处理方法),但这种方法有个很明显的弊病:增大了中断的潜伏期(导致中断必须等待svc服务完毕后才能处理),当然,这只是造成实时性稍微降低一些,并不是什么错误。其实,老兄这样的策略,倒不如ucos那样,直接关中断,来得快,代码也更小。

第三,老兄提到“如果用户硬要写,任何OS都无法避免不出错。”,这个我不敢苟同,试想:如果所有OS都必须将svc设置为最高,那么svc机制还有什么存在的必要?大家都先关中断,完了再开中断得了。高实时性就肯定没有办法实现?看看ecos的策略吧(linux也有类似的机制,就是著名的top-half和bottom-half):将中断分为两部分,实时部分和非实时部分,发生中断时,实时部分被立即调用,在实时部分的处理中,基本不能操作任何同步对象,当需要操作同步对象时,会通知调度器在适当的时机调度中断的非实时部分,而非实时部分可以操作同步对象进行数据交换及唤醒任务等等。

以上文字,如有冲撞之处,请多包涵。

出0入0汤圆

发表于 2011-2-15 23:36:17 | 显示全部楼层
回复【52楼】John_Lee  
-----------------------------------------------------------------------

再次讨论:
1. 文档的确需要完善下,告诉用户哪些资源已经被用掉了,不能随便改。谢提醒!
   TinyThread用到了 SysTick, SVC 两个中断,调整这两个优先级要慎重。
   话说回来,ecos也没允许用户将Timer中断屏蔽嘛。。。也没允许在乱改SWI嘛。。。。。多说无益,还是写文档来的好。哈哈。

2. M0的中断延迟16个周期, http://www.arm.com/products/processors/cortex-m/cortex-m0.php
   它帮用户做了保持用户程序上下文的动作。
   所以,如果关中断后,仍旧有进程上下文切换,用SVC不一定慢。这个跟以前ARM时代是不一样,进步了很多。
   当然啦,完美的OS,应能有效的套用M0硬件的自动上下文切换。TinyThread这个地方,仍有改进的空间。

3. “如果用户硬要写,任何OS都无法避免不出错。”这句话,
    指的是“用户不在nmi, hardfault异常中写和OS调度相关的代码”,如果硬要写,那没办法。
    比如nmi是不可屏蔽中断,随时可能进去。如果它进入后,将ucos的系统函数调用看看,ucos能健康不?
    (这个不是针对svc讲的。另外赞同你的话svc/pendsv在实现高效的中断实时上,还是有用处的)

出0入0汤圆

发表于 2011-2-20 23:07:22 | 显示全部楼层
mark

出0入168汤圆

发表于 2011-2-26 21:31:41 | 显示全部楼层
有中文文档就好了。

出0入0汤圆

发表于 2011-4-10 19:13:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-10 20:18:41 | 显示全部楼层
这资料怎么像我传给客户的

出0入0汤圆

发表于 2011-6-6 15:52:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-31 21:07:40 | 显示全部楼层
精彩,先收藏,另外问:Tiny Thread和RT Thread有什么关系吗?

出0入0汤圆

发表于 2011-7-31 21:11:11 | 显示全部楼层
牛人真多啊   学习了

出0入0汤圆

发表于 2011-8-23 11:28:02 | 显示全部楼层
想要申请DEMO板的样片的可以找我申请啊
回复【62楼】lanjingjing 蓝晶晶
-----------------------------------------------------------------------

想要申请DEMO板的样片的可以找我申请啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 02:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表