www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 1、uC/OSII簡(jiǎn)介u C / O S 是一種免費(fèi)公開(kāi)源代碼、結(jié)構(gòu)小巧、具有可剝奪實(shí)時(shí)內(nèi)核的實(shí)時(shí)操作系統(tǒng)。μC/OS-II 的前身是μC/OS,最早出自于1992 年美國(guó)嵌入式系統(tǒng)專家Jean

 1、uC/OSII簡(jiǎn)介

u C / O S 是一種免費(fèi)公開(kāi)源代碼、結(jié)構(gòu)小巧、具有可剝奪實(shí)時(shí)內(nèi)核的實(shí)時(shí)操作系統(tǒng)。

μC/OS-II 的前身是μC/OS,最早出自于1992 年美國(guó)嵌入式系統(tǒng)專家Jean J.Labrosse 在《嵌入式系統(tǒng)編程》雜志的5 月和6 月刊上刊登的文章連載,并把μC/OS 的源碼發(fā)布在該雜志的B B S 上。

μC/OS 和μC/OS-II 是專門(mén)為計(jì)算機(jī)的嵌入式應(yīng)用設(shè)計(jì)的, 絕大部分代碼是用C語(yǔ)言編寫(xiě)的。CPU 硬件相關(guān)部分是用匯編語(yǔ)言編寫(xiě)的、總量約200行的匯編語(yǔ)言部分被壓縮到最低限度,為的是便于移植到任何一種其它的CPU 上。用戶只要有標(biāo)準(zhǔn)的ANSI 的C交叉編譯器,有匯編器、連接器等軟件工具,就可以將μC/OS-II嵌人到開(kāi)發(fā)的產(chǎn)品中。μC/OS-II 具有執(zhí)行效率高、占用空間小、實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點(diǎn), 最小內(nèi)核可編譯至 2KB 。μC/OS-II 已經(jīng)移植到了幾乎所有知名的CPU 上。

嚴(yán)格地說(shuō)uC/OS-II只是一個(gè)實(shí)時(shí)操作系統(tǒng)內(nèi)核,它僅僅包含了任務(wù)調(diào)度,任務(wù)管理,時(shí)間管理,內(nèi)存管理和任務(wù)間的通信和同步等基本功能。沒(méi)有提供輸入輸出管理,文件系統(tǒng),網(wǎng)絡(luò)等額外的服務(wù)。但由于uC/OS-II良好的可擴(kuò)展性和源碼開(kāi)放,這些非必須的功能完全可以由用戶自己根據(jù)需要分別實(shí)現(xiàn)。

uC/OS-II目標(biāo)是實(shí)現(xiàn)一個(gè)基于優(yōu)先級(jí)調(diào)度的搶占式的實(shí)時(shí)內(nèi)核,并在這個(gè)內(nèi)核之上提供最基本的系統(tǒng)服務(wù),如信號(hào)量,郵箱,消息隊(duì)列,內(nèi)存管理,中斷管理等。

1.1任務(wù)管理

uC/OS-II 中最多可以支持64 個(gè)任務(wù),分別對(duì)應(yīng)優(yōu)先級(jí)0~63,其中0 為最高優(yōu)先級(jí)。63為最低級(jí),系統(tǒng)保留了4個(gè)最高優(yōu)先級(jí)的任務(wù)和4個(gè)最低優(yōu)先級(jí)的任務(wù),所有用戶可以使用的任務(wù)數(shù)有56個(gè)。

uC/OS-II提供了任務(wù)管理的各種函數(shù)調(diào)用,包括創(chuàng)建任務(wù),刪除任務(wù),改變?nèi)蝿?wù)的優(yōu)先級(jí),任務(wù)掛起和恢復(fù)等。

系統(tǒng)初始化時(shí)會(huì)自動(dòng)產(chǎn)生兩個(gè)任務(wù):一個(gè)是空閑任務(wù),它的優(yōu)先級(jí)最低,該任務(wù)僅給一個(gè)整形變量做累加運(yùn)算;另一個(gè)是系統(tǒng)任務(wù),它的優(yōu)先級(jí)為次低,該任務(wù)負(fù)責(zé)統(tǒng)計(jì)當(dāng)前cpu的利用率。

1.2 時(shí)間管理

uC/OS-II的時(shí)間管理是通過(guò)定時(shí)中斷來(lái)實(shí)現(xiàn)的,該定時(shí)中斷一般為10毫秒或100毫秒發(fā)生一次,時(shí)間頻率取決于用戶對(duì)硬件系統(tǒng)的定時(shí)器編程來(lái)實(shí)現(xiàn)。中斷發(fā)生的時(shí)間間隔是固定不變的,該中斷也成為一個(gè)時(shí)鐘節(jié)拍。

uC/OS-II要求用戶在定時(shí)中斷的服務(wù)程序中,調(diào)用系統(tǒng)提供的與時(shí)鐘節(jié)拍相關(guān)的系統(tǒng)函數(shù),例如中斷級(jí)的任務(wù)切換函數(shù),系統(tǒng)時(shí)間函數(shù)。

1.3 內(nèi)存管理

在ANSI C中是使用malloc和free兩個(gè)函數(shù)來(lái)動(dòng)態(tài)分配和釋放內(nèi)存。但在嵌入式實(shí)時(shí)系統(tǒng)中,多次這樣的操作會(huì)導(dǎo)致內(nèi)存碎片,且由于內(nèi)存管理算法的原因,malloc和free的執(zhí)行時(shí)間也是不確定。

uC/OS-II中把連續(xù)的大塊內(nèi)存按分區(qū)管理。每個(gè)分區(qū)中包含整數(shù)個(gè)大小相同的內(nèi)存塊,但不同分區(qū)之間的內(nèi)存快大小可以不同。用戶需要?jiǎng)討B(tài)分配內(nèi)存時(shí),系統(tǒng)選擇一個(gè)適當(dāng)?shù)姆謪^(qū),按塊來(lái)分配內(nèi)存。釋放內(nèi)存時(shí)將該塊放回它以前所屬的分區(qū),這樣能有效解決碎片問(wèn)題,同時(shí)執(zhí)行時(shí)間也是固定的。

1.4 任務(wù)間通信與同步

對(duì)一個(gè)多任務(wù)的操作系統(tǒng)來(lái)說(shuō),任務(wù)間的通信和同步是必不可少的。uC/OS-II中提供了4中同步對(duì)象,分別是信號(hào)量,郵箱,消息隊(duì)列和事件。所有這些同步對(duì)象都有創(chuàng)建,等待,發(fā)送,查詢的接口用于實(shí)現(xiàn)進(jìn)程間的通信和同步。

1.5 任務(wù)調(diào)度

uC/OS-II 采用的是可剝奪型實(shí)時(shí)多任務(wù)內(nèi)核??蓜儕Z型的實(shí)時(shí)內(nèi)核在任何時(shí)候都運(yùn)行就緒了的最高優(yōu)先級(jí)的任務(wù)。

uC/os-II的任務(wù)調(diào)度是完全基于任務(wù)優(yōu)先級(jí)的搶占式調(diào)度,也就是最高優(yōu)先級(jí)的任務(wù)一旦處于就緒狀態(tài),則立即搶占正在運(yùn)行的低優(yōu)先級(jí)任務(wù)的處理器資源。為了簡(jiǎn)化系統(tǒng)設(shè)計(jì),uC/OS-II規(guī)定所有任務(wù)的優(yōu)先級(jí)不同,因?yàn)槿蝿?wù)的優(yōu)先級(jí)也同時(shí)唯一標(biāo)志了該任務(wù)本身。

uC/OS-II詳細(xì)用法可參考相關(guān)資料。

2、FPGA下的uC/OS-II

下面就介紹怎樣在以黑金開(kāi)發(fā)板EP2C208上進(jìn)行uC/OSII實(shí)驗(yàn)。

第一步:添加一個(gè)用于系統(tǒng)時(shí)鐘節(jié)拍的定時(shí)器timer_ucos,定時(shí)時(shí)間為100ms(根據(jù)任務(wù)定)。

第二步:在Nios下設(shè)置相關(guān)選項(xiàng)。請(qǐng)看下面操作步驟。

打開(kāi)Quart II工程,以黑金開(kāi)發(fā)板EP2C208的工程為例,進(jìn)入SOPC Builder界面下如圖:

在左側(cè)的“System Contents”下單擊Peripherais的左側(cè)“

”;在彈出的菜單下單擊Microcotroller Peripherais的左側(cè)“

”;如下圖。

找到 “Interval Timer”并雙擊,彈出如下圖并按下圖進(jìn)行相關(guān)設(shè)置,單擊完成。

命名為timer_ucos;如下圖。

時(shí)鐘節(jié)拍定時(shí)器到此已添加完成,單擊Generate按鈕生成SOPC系統(tǒng)。

接下來(lái)對(duì)Quart II工程進(jìn)行編譯并把 “.pof”通過(guò)AS接口下接到EPCS中。至此Quart II工程工作完畢.。[!--empirenews.page--]

拉下來(lái)對(duì)Nios工程進(jìn)行設(shè)置。如果沒(méi)有關(guān)閉SOPC界面,可點(diǎn)擊“System Generation”下的Nios ii IDE按鈕即可進(jìn)行Nios工程,前提是安裝了Nios ii 軟件。

新建一個(gè)Nios II工程,單擊“File”菜單下“New”下的“Nios II C/C++ Application”如下圖。

進(jìn)入后出現(xiàn)如下圖,并按圖中參數(shù)設(shè)置(注ucosII為工程名,ep2c8q為SOPC系統(tǒng),Micro uC/OS-II tutorial為uCOS-II模板)。

單擊Next按鈕后按下圖設(shè)置后單擊Finish。

接下來(lái)對(duì)工程進(jìn)行基本的設(shè)置,右擊uCOSII選擇彈出菜單中的“System Library Properties”出現(xiàn)如下界面并按照如下參數(shù)設(shè)置。然后單擊OK。

把ucosii_tutorial.c中文件內(nèi)容用下面代碼代替。

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
[!--empirenews.page--]/*
 * =====================================================================================
 *
 *       Filename:  ds1302.c
 *
 *    Description:  DS1302驅(qū)動(dòng)
 *
 *        Version:  1.0.0
 *        Created:  2010.4.16
 *       Revision:  none
 *       Compiler:  Nios II 9.0 IDE
 *
 *         Author:  馬瑞 (AVIC)
 *          Email:  avic633@gmail.com  
 *
 * =====================================================================================
 */
  
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "includes.h"
#include "alt_ucosii_simple_error_check.h"
#include"ds1302.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
//定義椎棧
#define   TASK_STACKSIZE     2048
OS_STK    initialize_task_stk[TASK_STACKSIZE];
OS_STK    ds1302_task_stk[TASK_STACKSIZE];
[!--empirenews.page--]OS_STK    led_task_stk[TASK_STACKSIZE];
OS_STK    seg_task_stk[TASK_STACKSIZE];
//定義優(yōu)先級(jí)
#define INITIALIZE_TASK_PRIORITY   6
#define LED_TASK_PRIORITY    10
#define DS1302_TASK_PRIORITY    11
#define SEG_TASK_PRIORITY    12
//格式為: 秒 分 時(shí) 日 月 星期 年
unsigned char time[7] = {0x00,0x19,0x14,0x17,0x03,0x17,0x10};
unsigned char ti[][7]={"一","二","三","四","五","六","日"}; 
alt_u8 segtab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char bittab[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char led_buffer[8]={1,2,3,4,5,6,7,8};
static unsigned char cnt=0; 
void seg_handler(void);
  
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  ds1302_task
 *  Description:  任務(wù)1 調(diào)用ds1302驅(qū)動(dòng)并通過(guò)串口顯示數(shù)據(jù)  
 * =====================================================================================
 */  
void ds1302_task(void* pdata)
[!--empirenews.page--]{
    INT8U return_code = OS_NO_ERR;
    ds1302.set_time(time); 
    printf("Hello from Nios II!n");
      
    while(1){
        printf("Hello from Nios II!rn");
        ds1302.get_time(time);   
        printf("%02d-%02d-%02d %02d:%02d:%02d 星期%srn",
        time[6],time[4],time[3],time[2],time[1],time[0],ti[time[5]-1]);
          
        OSTimeDlyHMSM(0, 0, 1, 0);
    }
      
}
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  led_task
 *  Description:  任務(wù)2 調(diào)用LED驅(qū)動(dòng)并通過(guò)串口顯示數(shù)據(jù) 
 * =====================================================================================
 */  
void led_task(void* pdata)
{
    INT8U return_code = OS_NO_ERR;  
    unsigned int num=0;
    LED->DATA =0xffffffff;
    
    while (1){   
[!--empirenews.page--]        printf("led is running!rn");  
          
        if(num%2==0)
          LED->DATA =0xffffffff;
        else LED->DATA =0;
        num++;
      
        OSTimeDlyHMSM(0, 0, 2, 0);
    }
}
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  seg_task
 *  Description:  任務(wù)3 調(diào)用數(shù)碼管驅(qū)動(dòng)并通過(guò)串口顯示數(shù)據(jù) 
 * =====================================================================================
 */  
void seg_task(void* pdata)
{
    INT8U return_code = OS_NO_ERR;  
    unsigned int numseg=0;
      
    while (1){   
        numseg++;  
        seg_handler();
        OSTimeDlyHMSM(0, 0, 0, 300);
    }
}
/* 
 * ===  FUNCTION  ======================================================================
[!--empirenews.page--] *         Name:  seg_handler
 *  Description:   
 * =====================================================================================
 */  
 void seg_handler(void)
{
    IOWR_ALTERA_AVALON_PIO_DATA(SEG_SEL_BASE, 0xff);
    IOWR_ALTERA_AVALON_PIO_DATA(SEG_SEL_BASE, bittab[cnt]);
  
    IOWR_ALTERA_AVALON_PIO_DATA(SEG_DAT_BASE, segtab[led_buffer[cnt]]); 
  
    cnt++;
    if(cnt==6)
        cnt=0;   
}
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  main
 *  Description:   
 * =====================================================================================
 */  
void  initialize_task(void* pdata)
{
    INT8U return_code = OS_NO_ERR;  
    initCreateTasks();
    
    return_code = OSTaskDel(OS_PRIO_SELF);
    while (1);
}
  
/* 
[!--empirenews.page--] * ===  FUNCTION  ======================================================================
 *         Name:  main
 *  Description:   
 * =====================================================================================
 */  
int main (int argc, char* argv[], char* envp[])
{
    INT8U return_code = OS_NO_ERR;
     
    return_code = OSTaskCreateExt(initialize_task,
                             NULL,
                             (void *)&initialize_task_stk[TASK_STACKSIZE],
                             INITIALIZE_TASK_PRIORITY,
                             INITIALIZE_TASK_PRIORITY,
                             initialize_task_stk,
                             TASK_STACKSIZE,
                             NULL,
                 0);
    OSStart();
    return 0;
}
  
[!--empirenews.page--]/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  initCreateTasks
 *  Description:   
 * =====================================================================================
 */  
int initCreateTasks(void)
{
    INT8U return_code = OS_NO_ERR;
    return_code = OSTaskCreateExt(ds1302_task,
                             NULL,
                             (void *)&ds1302_task_stk[TASK_STACKSIZE],
                             DS1302_TASK_PRIORITY,
                             DS1302_TASK_PRIORITY,
                             ds1302_task_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);
    return_code = OSTaskCreateExt(led_task,
                             NULL,
                             (void *)&led_task_stk[TASK_STACKSIZE],
[!--empirenews.page--]                             LED_TASK_PRIORITY,
                             LED_TASK_PRIORITY,
                             led_task_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);
    return_code = OSTaskCreateExt(seg_task,
                             NULL,
                             (void *)&seg_task_stk[TASK_STACKSIZE],
                             SEG_TASK_PRIORITY,
                             SEG_TASK_PRIORITY,
                             seg_task_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);
    return 0;
}

編譯Nios II工程,下載到EPCS中,下載的方法前面章節(jié)講過(guò),這里就不再重復(fù)了。下面是PC機(jī)上串口調(diào)試工具上的數(shù)據(jù)。在開(kāi)發(fā)板上還可以看到四個(gè)LED燈在閃爍和數(shù)碼管顯示654321。

[!--empirenews.page--]
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

武漢2025年9月9日 /美通社/ -- 7月24日,2025慧聰跨業(yè)品牌巡展——湖北?武漢站在武漢中南花園酒店隆重舉辦!本次巡展由慧聰安防網(wǎng)、慧聰物聯(lián)網(wǎng)、慧聰音響燈光網(wǎng)、慧聰LED屏網(wǎng)、慧聰教育網(wǎng)聯(lián)合主辦,吸引了安防、...

關(guān)鍵字: AI 希捷 BSP 平板

上海2025年9月9日 /美通社/ -- 9月8日,移遠(yuǎn)通信宣布,其自研藍(lán)牙協(xié)議棧DynaBlue率先通過(guò)藍(lán)牙技術(shù)聯(lián)盟(SIG)BQB 6.1標(biāo)準(zhǔn)認(rèn)證。作為移遠(yuǎn)深耕短距離通信...

關(guān)鍵字: 藍(lán)牙協(xié)議棧 移遠(yuǎn)通信 COM BSP

上海2025年9月9日 /美通社/ -- 為全面落實(shí)黨中央、國(guó)務(wù)院和上海市委、市政府關(guān)于加快發(fā)展人力資源服務(wù)業(yè)的決策部署,更好發(fā)揮人力資源服務(wù)業(yè)賦能百業(yè)作用,8月29日,以"AI智領(lǐng) HR智鏈 靜候你來(lái)&quo...

關(guān)鍵字: 智能體 AI BSP 人工智能

北京2025年9月8日 /美通社/ -- 近日,易生支付與一汽出行達(dá)成合作,為其自主研發(fā)的"旗馭車管"車輛運(yùn)營(yíng)管理平臺(tái)提供全流程支付通道及技術(shù)支持。此次合作不僅提升了平臺(tái)對(duì)百余家企業(yè)客戶的運(yùn)營(yíng)管理效率...

關(guān)鍵字: 一汽 智能化 BSP SAAS

深圳2025年9月8日 /美通社/ -- 晶泰科技(2228.HK)今日宣布,由其助力智擎生技制藥(PharmaEngine, Inc.)發(fā)現(xiàn)的新一代PRMT5抑制劑PEP0...

關(guān)鍵字: 泰科 AI MT BSP

上海2025年9月5日 /美通社/ -- 由上海市經(jīng)濟(jì)和信息化委員會(huì)、上海市發(fā)展和改革委員會(huì)、上海市商務(wù)委員會(huì)、上海市教育委員會(huì)、上海市科學(xué)技術(shù)委員會(huì)指導(dǎo),東浩蘭生(集團(tuán))有限公司主辦,東浩蘭生會(huì)展集團(tuán)上海工業(yè)商務(wù)展覽有...

關(guān)鍵字: 電子 BSP 芯片 自動(dòng)駕駛

推進(jìn)卓越制造,擴(kuò)大產(chǎn)能并優(yōu)化布局 蘇州2025年9月5日 /美通社/ --?耐世特汽車系統(tǒng)與蘇州工業(yè)園區(qū)管委會(huì)正式簽署備忘錄,以設(shè)立耐世特亞太總部蘇州智能制造項(xiàng)目。...

關(guān)鍵字: 智能制造 BSP 汽車系統(tǒng) 線控

慕尼黑和北京2025年9月4日 /美通社/ -- 寶馬集團(tuán)宣布,新世代首款量產(chǎn)車型BMW iX3將于9月5日全球首發(fā),9月8日震撼亮相慕尼黑車展。中國(guó)專屬版車型也將在年內(nèi)與大家見(jiàn)面,2026年在國(guó)內(nèi)投產(chǎn)。 寶馬集團(tuán)董事...

關(guān)鍵字: 寶馬 慕尼黑 BSP 數(shù)字化

北京2025年9月4日 /美通社/ --?在全球新一輪科技革命與產(chǎn)業(yè)變革的澎湃浪潮中,人工智能作為引領(lǐng)創(chuàng)新的核心驅(qū)動(dòng)力,正以前所未有的深度與廣度重塑各行業(yè)發(fā)展格局。體育領(lǐng)域深度融入科技變革浪潮,駛?cè)霐?shù)字化、智能化轉(zhuǎn)型快車...

關(guān)鍵字: 人工智能 智能體 AI BSP

上海2025年9月2日 /美通社/ -- 近日,由 ABB、Moxa(摩莎科技)等八家企業(yè)在上海聯(lián)合發(fā)起并成功舉辦"2025 Ethernet-APL 技術(shù)應(yīng)用發(fā)展大會(huì)"。會(huì)議以"破界?融合...

關(guān)鍵字: ETHERNET 智能未來(lái) BSP 工業(yè)通信
關(guān)閉