task2

Task2(2day)

列表
1)标志

2)基本操作(创建,append(),pop(),del(),拷贝)

3)列表相关方法

2.元组

1)标志

2)基本操作(创建及不可变性)

3.string字符串

1)定义及基本操作(+,*,读取方式)

2)字符串相关方法

4.字符串格式化问题

1.创建列表。只要把逗号分隔的不同的数据项使用方括号括起来即可

1 List = [‘wade’,‘james’,‘bosh’,‘haslem’]
与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等

2.添加新的元素

复制代码
1 List.append(‘allen’) #方式一:向list结尾添加 参数object
2 >>> a=[1,2,3,4]
3 >>> a.append(5)
4 >>> print(a)
5 [1, 2, 3, 4, 5]
6
7 List.insert(4,‘lewis’) #方式二:插入一个元素 参数一:index位置 参数二:object
8 >>> a=[1,2,4]
9 >>> a.insert(2,3)
10 >>> print(a)
11 [1, 2, 3, 4]
12
13 List.extend(tableList) #方式三:扩展列表,参数:iterable参数
14 >>> a=[1,2,3]
15 >>> b=[4,5,6]
16 >>> a.extend(b)
17 >>> print(a)
18 [1, 2, 3, 4, 5, 6]
复制代码
3.遍历列表

1 for i in List:
2 print i,
4.访问列表中的值
使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符,如下所示:

1 >>> List = [1, 2, 3, 4, 5, 6, 7 ]
2 >>> print(List[3])
3 4
5.从list删除元素

复制代码
1 List.remove() #删除方式一:参数object 如有重复元素,只会删除最靠前的
2 >>> a=[1,2,3]
3 >>> a.remove(2)
4 >>> print(a)
5 [1, 3]
6
7 List.pop() #删除方式二:pop 可选参数index删除指定位置的元素 默认为最后一个元素
8 >>> a=[1, 2, 3, 4, 5, 6]
9 >>> a.pop()
10 6
11 >>> print(a)
12 [1, 2, 3, 4, 5]
13
14
15 del List #删除方式三:可以删除整个列表或指定元素或者列表切片,list删除后无法访问。
16 >>> a=[1, 2, 3, 4, 5, 6]
17 >>> del a[5]
18 >>> print(a)
19 [1, 2, 3, 4, 5]
20 >>> del a
21 >>> print(a)
22 Traceback (most recent call last):
23 File “<pyshell#93>”, line 1, in
24 print(a)
复制代码

6.排序和反转代码

复制代码
1 List.reverse()
2 >>> a=[1, 2, 3, 4, 5, 6]
3 >>> a.reverse()
4 >>> print(a)
5 [6, 5, 4, 3, 2, 1]
6
7
8 List.sort() #sort有三个默认参数 cmp=None,key=None,reverse=False 因此可以制定排序参数
9 >>> a=[2,4,6,7,3,1,5]
10 >>> a.sort()
11 >>> print(a)
12 [1, 2, 3, 4, 5, 6, 7]
13 #python3X中,不能将数字和字符一起排序,会出现此报错
14 >>> a=[2,4,6,7,3,1,5,‘a’]
15 >>> a.sort()
16 Traceback (most recent call last):
17 File “<pyshell#104>”, line 1, in
18 a.sort()
19 TypeError: unorderable types: str() < int()
复制代码
7.Python列表截取

复制代码
1 Python的列表截取与字符串操作类型相同,如下所示:
2 L = [‘spam’, ‘Spam’, ‘SPAM!’]
3 操作:
4 Python 表达式 结果 描述
5 L[2] ‘SPAM!’ 读取列表中第三个元素
6 L[-2] ‘Spam’ 读取列表中倒数第二个元素
7 L[1:] [‘Spam’, ‘SPAM!’] 从第二个元素开始截取列表
复制代码
8.Python列表操作的函数和方法

1 列表操作包含以下函数:
2 1、cmp(list1, list2):比较两个列表的元素 (python3已丢弃)
3 2、len(list):列表元素个数
4 3、max(list):返回列表元素最大值
5 4、min(list):返回列表元素最小值
6 5、list(seq):将元组转换为列表
复制代码
1 列表操作常用操作包含以下方法:
2 1、list.append(obj):在列表末尾添加新的对象
3 2、list.count(obj):统计某个元素在列表中出现的次数
4 3、list.extend(seq):在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
5 4、list.index(obj):从列表中找出某个值第一个匹配项的索引位置
6 5、list.insert(index, obj):将对象插入列表
7 6、list.pop(obj=list[-1]):移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
8 7、list.remove(obj):移除列表中某个值的第一个匹配项
9 8、list.reverse():反向列表中元素
10 9、list.sort([func]):对原列表进行排序
Python的元组与列表类似,同样可通过索引访问,支持异构,任意嵌套。不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。

创建元组

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可

tup1 = ()          #空元组

tup2 = (‘a’,‘b’,‘c’,‘d’)

tup3 = (1,2,3,‘a’,‘b’,‘c’)

元组操作方法及实例展示

可以使用dir(tuple)查看元组支持的操作

count

1 功能:统计元组中某元素的个数
2 语法:T.count(value) -> integer – return number of occurrences of value
3 T = (‘a’,‘b’,‘c’,‘d’,1,2,2,3,4)
4 T.count(2)
5 结果:2
index

复制代码
1 功能:获取元素在元组中的索引值,对于重复的元素,默认获取从左起第一个元素的索引值
2 语法:T.index(value, [start, [stop]]) -> integer – return first index of value.Raises ValueError if the value is not present.
3 T = (‘a’,‘b’,2,‘c’,‘d’,1,2,3,4)
4 T.index(2)
5 结果:2 #元素2第一次出现在索引为2的位置
6 T.index(2,3,7)
7 结果:6
复制代码
T1 + T2

复制代码
1 功能:合并两个元组,返回一个新的元组,原元组不变
2 语法:T = T1 + T2
3 T1 = (‘a’,‘b’,‘c’)
4 T2 = (1,2,3,4)
5 T = T1 + T 2
6 结果:
7 print T
8 (‘a’,‘b’,‘c’,1,2,3,4)
9 print T1
10 (‘a’,‘b’,‘c’)
11 print T2
12 (1,2,3,4)
复制代码
T1 * N

复制代码
1 功能:重复输出元组N次,返回一个新元组,原元组不变
2 语法:T = T1 * N
3 T1 = (‘a’,‘b’,1,2,3)
4 T = T1 * 3
5 结果:
6 print T
7 (‘a’,‘b’,1,2,3,‘a’,‘b’,1,2,3,‘a’,‘b’,1,2,3)
8 print T1
9 (‘a’,‘b’,1,2,3)
复制代码
元组虽然不可变,但是当元组中嵌套可变元素时,该可变元素是可以修改的,元组本身不变,使用id(tuple)查看。

复制代码
1 T = (‘a’,‘b’,‘c’,[1,2,3,4],1,2,3)
2 id(T)
3 140073510482784
4 print T[3]
5 [1,2,3,4]
6 T[3].append(5)
7 print T[3]
8 [1,2,3,4,5]
9 print T
10 (‘a’,‘b’,‘c’,[1,2,3,4,5],1,2,3)
11 id(T)
12 140073510482784
复制代码
元组支持切片操作

复制代码
1 语法:T[start [, stop[, step]]]
2 实例演示:
3 T = (‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’)
4 print T[:] #取所有元素
5 (‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’)
6 print T[2:] #取从索引2开始到末尾的元素
7 (‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’)
8 print T[2:6] #取索引2到6的所有元素,不包含索引6
9 (‘c’, ‘d’, ‘e’, ‘f’)
10 print T[2:6:2] #从索引2到6,每隔一个元素取一个
11 (‘c’, ‘e’)

一、String
 String 是定义一个字符串对象(内存中的字符串都是一个对象。)
 String 一旦被初始化就不能被改变(可以改变变量指向,但是不能改变对象内容)
 
定义方式: String s1 = “abc”; //在内存中存在一个对象。
String s2 = new String(“abc”)//在内存中存在两个对象。
         String s3 = “abc”;

二、字符串的常见方法
1、获取:字符串中包含的字符数(也就是字符串的长度)
int length(); (注意与数组中的length做区别,数组中为属性,字符串中为方法)

2、判断

2.1、判断字符串中是否包含指定字符串
boolean contains(CharSequence s) :CharSequence:为String实现的接口

3、转换
将字符数组转换成字符串
构造函数: String(char[] value)
String(char[] value, int offset, int count): 将数组中从下标offset开始,一共count位字符转换成字符串。

4、替换
 String replace(char oldChar, char newChar) : 返回一个数组,它是用newChar 替换就数组中的oldchar等到的。(一个一个的替换)
String replace(CharSequence target, CharSequence replacement) : 后替前,用新串替换原串中的子串。

注:原字符串没有改变,只是新出现了一个替换后的字符串(字符串一旦初始化,不能改变)
如果要替换的字符没有,还是返回原串,不会生成新的字符串。

5、切割,分割

String[] split(String regex) : 指定其中某一个字符或字符串,以其下刀,切割字符串(其实应当依据正则表达式规则拆分)

6、子串:(获取一个字符串的一部分)

String substring(int beginIndex) //从指定下标位置到结尾。
String substring(int beginIndex, int endIndex) //从指定下标位置到结束下标位置前一个

7、转换、去除空格、比较

7.1:将字符串转换成大写或者小写。
String toUpperCase()
String toLowerCase()
7.2:将字符串两端多余的空额去除。
           String trim()
7.3:将两个字符串进行自然顺序的比较。
         
int compareTo(String anotherString)
int compareToIgnoreCase(String str) :不考虑大小写。

#include "includes.h" #include "stm32f10x_gpio.h" #include "xxGpio.h" //任务优先级 #define START_TASK_PRIO 3 //任务堆栈大小 #define START_STK_SIZE 128 //任务控制块 OS_TCB StartTaskTCB; //任务堆栈 CPU_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *p_arg); #define LED0_PIN GPIO_Pin_1 // #define LED0_PORT GPIOA /* GPIOB */ #define LED0_ON() GPIO_SetLow(LED0_PORT, LED0_PIN); //0 #define LED0_OFF() GPIO_SetHigh(LED0_PORT, LED0_PIN); //0 #define LED1_PIN GPIO_Pin_2 // #define LED1_PORT GPIOA /* GPIOB */ #define LED1_ON() GPIO_SetLow(LED1_PORT, LED1_PIN); //0 #define LED1_OFF() GPIO_SetHigh(LED1_PORT, LED1_PIN); //0 #define LED2_PIN GPIO_Pin_3 // #define LED2_PORT GPIOA /* GPIOB */ #define LED2_ON() GPIO_SetLow(LED2_PORT, LED2_PIN); //0 #define LED2_OFF() GPIO_SetHigh(LED2_PORT, LED2_PIN); //0 GpioCfg_ts LED0_Cfg = { LED0_PORT, LED0_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; GpioCfg_ts LED1_Cfg = { LED1_PORT, LED1_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; GpioCfg_ts LED2_Cfg = { LED2_PORT, LED2_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; void LEDT_Init(void) { GPIO_Config( &LED0_Cfg ); GPIO_Config( &LED1_Cfg ); GPIO_Config( &LED2_Cfg ); } OS_Q DATA_Msg; //定义一个消息队列,用于发送数据 //主函数 int main(void) { OS_ERR err; CPU_SR_ALLOC(); LEDT_Init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置 OSInit(&err); /* Init uC/OS-III. */ //创建开始任务 OSTaskCreate( (OS_TCB * )&StartTaskTCB, //任务控制块 (CPU_CHAR * )"start task", //任务名字 (OS_TASK_PTR )start_task, //任务函数 (void * )0, //传递给任务函数的参数 (OS_PRIO )START_TASK_PRIO, //任务优先级 (CPU_STK * )&START_TASK_STK[0], //任务堆栈基地址 (CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位 (CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小 (OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度, (void * )0, //用户补充的存储区 (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项 (OS_ERR * )&err); //存放该函数错误时的返 OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */ } /****************************************************************************************** * * 实验(一) * *******************************************************************************************/ // 创建1个任务,任务执行完毕后自动退出 #if(0) //任务优先级 #define TASK1_TASK_PRIO 4 //任务堆栈大小 #define TASK1_STK_SIZE 128 //任务控制块 OS_TCB Task1_TaskTCB; //任务堆栈 CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); //任务优先级 #define TASK2_TASK_PRIO 4 //任务堆栈大小 #define TASK2_STK_SIZE 128 //任务控制块 OS_TCB Task2_TaskTCB; //任务堆栈 CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; void task2_task(void *p_arg); //开始任务任务函数 void start_task(void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ // Mem_Init(); /* Initialize Memory Management Module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif CPU_IntDisMeasMaxCurReset(); #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif //创建TASK1任务 OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK2任务 OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"Task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //删除start_task任务自身 // OSTaskDel( (OS_TCB*)0, &err ); } //task1任务函数 volatile uint32_t i; uint8_t LedStates = 1; void task1_task(void *p_arg) { OS_ERR err; uint8_t count = 10; while(1) { // 任务1正常运行时LED0闪烁 for(uint8_t count = 0; count < 5; count++) { LED0_ON(); for(i = 0; i < 200000; i++); // 简单延时 LED0_OFF(); for(i = 0; i < 200000; i++); // 简单延时 } // 挂起任务2(LED1将停止闪烁) OSTaskSuspend(&Task2_TaskTCB, &err); OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err); // 延时2秒 // 唤醒任务2(LED1恢复闪烁) OSTaskResume(&Task2_TaskTCB, &err); OSTimeDlyHMSM(0, 0, 3, 0, OS_OPT_TIME_DLY, &err); // 延时3秒 // 删除任务2 OSTaskDel(&Task2_TaskTCB, &err); OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); // 延时1秒 // 删除任务1自身 OSTaskDel((OS_TCB*)0, &err); } } //task2任务函数 void task2_task(void *p_arg) { volatile uint32_t i; while(1) { // LED1持续闪烁 LED1_ON(); for(i = 0; i < 200000; i++); // 简单延时 LED1_OFF(); for(i = 0; i < 200000; i++); // 简单延时 // 让出CPU时间 OSTimeDly(1, OS_OPT_TIME_DLY, NULL); } } #endif /****************************************************************************************** * * 实验(二) * *******************************************************************************************/ // 创建1个任务,任务执行完毕后自动退出 #if(0) //任务优先级 #define TASK1_TASK_PRIO 4 //任务堆栈大小 #define TASK1_STK_SIZE 128 //任务控制块 OS_TCB Task1_TaskTCB; //任务堆栈 CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); //任务优先级 #define TASK2_TASK_PRIO 4 //任务堆栈大小 #define TASK2_STK_SIZE 128 //任务控制块 OS_TCB Task2_TaskTCB; //任务堆栈 CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; void task2_task(void *p_arg); //任务优先级 #define TASK3_TASK_PRIO 4 //任务堆栈大小 #define TASK3_STK_SIZE 128 //任务控制块 OS_TCB Task3_TaskTCB; //任务堆栈 CPU_STK TASK3_TASK_STK[TASK3_STK_SIZE]; void task3_task(void *p_arg); // 信号量定义 OS_SEM SharedResourceSem; // 共享资源信号量 OS_SEM SyncSem; // 同步信号量 //开始任务任务函数 void start_task(void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ // Mem_Init(); /* Initialize Memory Management Module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif CPU_IntDisMeasMaxCurReset(); #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif //创建TASK1任务 OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK2任务 OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"Task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK3任务 OSTaskCreate((OS_TCB * )&Task3_TaskTCB, (CPU_CHAR * )"Task3 task", (OS_TASK_PTR )task3_task, (void * )0, (OS_PRIO )TASK3_TASK_PRIO, (CPU_STK * )&TASK3_TASK_STK[0], (CPU_STK_SIZE)TASK3_STK_SIZE/10, (CPU_STK_SIZE)TASK3_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //删除start_task任务自身 // OSTaskDel( (OS_TCB*)0, &err ); } // 低优先级任务函数 void task1_task(void *p_arg) { OS_ERR err; while(1) { // 获取共享资源信号量(第一次信号量接收) OSSemPend(&SharedResourceSem, 0, OS_OPT_PEND_BLOCKING, 0, &err); // 模拟处理共享资源(长时间操作) OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err); // 延时2秒 // 发送同步信号量(第一次信号量发送) OSSemPost(&SyncSem, OS_OPT_POST_1, &err); // 释放共享资源信号量 OSSemPost(&SharedResourceSem, OS_OPT_POST_1, &err); OSTimeDlyHMSM(0, 0, 5, 0, OS_OPT_TIME_DLY, &err); // 延时5秒 } } // 中优先级任务函数 void task2_task(void *p_arg) { OS_ERR err; while(1) { // 执行不需要共享资源的操作 // 这个任务会抢占低优先级任务 OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); // 延时1秒 } } // 高优先级任务函数 void task3_task(void *p_arg) { OS_ERR err; while(1) { // 等待同步信号量(第二次信号量接收) OSSemPend(&SyncSem, 0, OS_OPT_PEND_BLOCKING, 0, &err); // 获取共享资源信号量(第二次信号量接收) OSSemPend(&SharedResourceSem, 0, OS_OPT_PEND_BLOCKING, 0, &err); // 执行关键操作 // 这里应该快速完成... // 发送同步信号量(第二次信号量发送) OSSemPost(&SyncSem, OS_OPT_POST_1, &err); // 释放共享资源信号量 OSSemPost(&SharedResourceSem, OS_OPT_POST_1, &err); OSTimeDlyHMSM(0, 0, 5, 0, OS_OPT_TIME_DLY, &err); // 延时5秒 } } #endif /****************************************************************************************** * * 实验(二) * *******************************************************************************************/ // 创建1个任务,任务执行完毕后自动退出 #if(1) //任务优先级 #define TASK1_TASK_PRIO 4 //任务堆栈大小 #define TASK1_STK_SIZE 128 //任务控制块 OS_TCB Task1_TaskTCB; //任务堆栈 CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); //任务优先级 #define TASK2_TASK_PRIO 4 //任务堆栈大小 #define TASK2_STK_SIZE 128 //任务控制块 OS_TCB Task2_TaskTCB; //任务堆栈 CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; void task2_task(void *p_arg); //任务优先级 #define TASK3_TASK_PRIO 4 //任务堆栈大小 #define TASK3_STK_SIZE 128 //任务控制块 OS_TCB Task3_TaskTCB; //任务堆栈 CPU_STK TASK3_TASK_STK[TASK3_STK_SIZE]; void task3_task(void *p_arg); // 信号量定义 OS_SEM SharedResourceSem; // 共享资源信号量 OS_SEM SyncSem; // 同步信号量 //开始任务任务函数 void start_task(void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ // Mem_Init(); /* Initialize Memory Management Module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif CPU_IntDisMeasMaxCurReset(); #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif //创建TASK1任务 OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK2任务 OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"Task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK3任务 OSTaskCreate((OS_TCB * )&Task3_TaskTCB, (CPU_CHAR * )"Task3 task", (OS_TASK_PTR )task3_task, (void * )0, (OS_PRIO )TASK3_TASK_PRIO, (CPU_STK * )&TASK3_TASK_STK[0], (CPU_STK_SIZE)TASK3_STK_SIZE/10, (CPU_STK_SIZE)TASK3_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //删除start_task任务自身 // OSTaskDel( (OS_TCB*)0, &err ); } #endif   帮我生成一个UCOSⅢ消息实验代码 任务要求:设计一个消息发送、接收例程,必须包含消息发送和接收,且接收消息后必须对消息长度和数据进行处理。共三个任务。
06-23
<think>我们将在提供的框架基础上,设计一个包含三个任务的UCOSⅢ消息实验代码。三个任务分别是:1.发送任务(SenderTask):负责创建消息并发送到消息队列。2.处理任务(ProcessorTask):负责从消息队列接收消息,处理消息(包括验证消息长度和数据),然后发送到另一个队列。3.接收任务(ReceiverTask):负责从处理任务发送的队列中接收消息,打印消息详情,然后释放消息内存。我们将使用两个消息队列:-SendQueue:用于发送任务向处理任务发送消息。-RecvQueue:用于处理任务向接收任务发送处理后的消息。消息结构体定义如下:typedefstruct{CPU_INT16Umsg_id;//消息IDCPU_INT16Udata_length;//数据长度CPU_CHARdata[MAX_MSG_LENGTH];//消息数据CPU_INT32Uchecksum;//校验和(可选,用于数据验证)}APP_MSG;任务优先级安排(数值越低优先级越高):-接收任务(最高优先级,确保及时处理)-处理任务(中等优先级)-发送任务(最低优先级)我们还需要一个内存池来管理消息内存,避免频繁动态分配内存。由于提供的代码框架中已经包含了LED初始化和一些任务创建的模板,我们将在此基础上添加三个任务。注意:由于实验要求三个任务,我们将创建三个任务,并使用两个消息队列。步骤:1.在start_task中创建两个消息队列(SendQueue和RecvQueue)和内存池。2.创建三个任务:发送任务、处理任务和接收任务。3.在发送任务中,从内存池获取消息内存,填充消息内容(包括ID、数据、长度和校验和),然后发送到SendQueue。4.在处理任务中,从SendQueue接收消息,验证消息长度和数据(例如计算校验和),然后进行一些处理(例如转换数据格式),最后发送到RecvQueue。5.在接收任务中,从RecvQueue接收消息,打印消息详情,然后将消息内存释放回内存池。下面我们开始编写代码。</think># UCOSⅢ三任务消息传递实验设计与实现 下面我将基于您提供的框架,设计一个完整的UCOSⅢ消息传递实验,包含三个任务:发送任务、处理任务和接收任务。 ```c #include "includes.h" #include "stm32f10x_gpio.h" #include "xxGpio.h" // 任务优先级定义 #define START_TASK_PRIO 3 #define SENDER_TASK_PRIO 6 #define PROCESSOR_TASK_PRIO 7 #define RECEIVER_TASK_PRIO 8 // 任务堆栈大小 #define START_STK_SIZE 128 #define SENDER_STK_SIZE 128 #define PROCESSOR_STK_SIZE 128 #define RECEIVER_STK_SIZE 128 // 任务控制块 OS_TCB StartTaskTCB; OS_TCB SenderTaskTCB; OS_TCB ProcessorTaskTCB; OS_TCB ReceiverTaskTCB; // 任务堆栈 CPU_STK START_TASK_STK[START_STK_SIZE]; CPU_STK SENDER_TASK_STK[SENDER_STK_SIZE]; CPU_STK PROCESSOR_TASK_STK[PROCESSOR_STK_SIZE]; CPU_STK RECEIVER_TASK_STK[RECEIVER_STK_SIZE]; // 消息队列 OS_Q SendQueue; // 发送->处理队列 OS_Q RecvQueue; // 处理->接收队列 // 消息结构体 typedef struct { CPU_INT16U msg_id; // 消息ID CPU_INT16U data_length; // 数据长度 CPU_CHAR data[50]; // 消息数据 CPU_INT32U checksum; // 校验和 } APP_MSG; // 内存池 OS_MEM *MsgPool; #define MSG_POOL_SIZE 5 CPU_ALIGN CPU_CHAR MsgMemory[MSG_POOL_SIZE * sizeof(APP_MSG)]; // 函数声明 void start_task(void *p_arg); void sender_task(void *p_arg); void processor_task(void *p_arg); void receiver_task(void *p_arg); void init_memory_pool(void); void process_message(APP_MSG *msg); void print_message(APP_MSG *msg); // 硬件初始化 (基于您提供的代码) #define LED0_PIN GPIO_Pin_1 #define LED0_PORT GPIOA #define LED0_ON() GPIO_SetLow(LED0_PORT, LED0_PIN) #define LED0_OFF() GPIO_SetHigh(LED0_PORT, LED0_PIN) #define LED1_PIN GPIO_Pin_2 #define LED1_PORT GPIOA #define LED1_ON() GPIO_SetLow(LED1_PORT, LED1_PIN) #define LED1_OFF() GPIO_SetHigh(LED1_PORT, LED1_PIN) #define LED2_PIN GPIO_Pin_3 #define LED2_PORT GPIOA #define LED2_ON() GPIO_SetLow(LED2_PORT, LED2_PIN) #define LED2_OFF() GPIO_SetHigh(LED2_PORT, LED2_PIN) GpioCfg_ts LED0_Cfg = { LED0_PORT, LED0_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; GpioCfg_ts LED1_Cfg = { LED1_PORT, LED1_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; GpioCfg_ts LED2_Cfg = { LED2_PORT, LED2_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; void LEDT_Init(void) { GPIO_Config( &LED0_Cfg ); GPIO_Config( &LED1_Cfg ); GPIO_Config( &LED2_Cfg ); } int main(void) { OS_ERR err; CPU_SR_ALLOC(); LEDT_Init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断分组配置 OSInit(&err); // 初始化UCOS-III // 创建开始任务 OSTaskCreate((OS_TCB *)&StartTaskTCB, (CPU_CHAR *)"start task", (OS_TASK_PTR)start_task, (void *)0, (OS_PRIO )START_TASK_PRIO, (CPU_STK *)&START_TASK_STK[0], (CPU_STK_SIZE)START_STK_SIZE/10, (CPU_STK_SIZE)START_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void *)0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR *)&err); OSStart(&err); // 启动UCOS-III } // 初始化内存池 void init_memory_pool(void) { OS_ERR err; // 创建消息内存池 MsgPool = OSMemCreate((void *)&MsgMemory[0], (OS_QTY )MSG_POOL_SIZE, (OS_SIZE )sizeof(APP_MSG), (OS_ERR *)&err); if (err != OS_ERR_NONE) { // 内存池创建失败处理 while(1); } } // 起始任务函数 void start_task(void *p_arg) { OS_ERR err; (void)p_arg; // 初始化内存池 init_memory_pool(); // 创建消息队列 OSQCreate((OS_Q *)&SendQueue, (CPU_CHAR *)"Send Queue", (OS_MSG_QTY )5, (OS_ERR *)&err); OSQCreate((OS_Q *)&RecvQueue, (CPU_CHAR *)"Recv Queue", (OS_MSG_QTY )5, (OS_ERR *)&err); // 创建接收任务(最高优先级) OSTaskCreate((OS_TCB *)&ReceiverTaskTCB, (CPU_CHAR *)"Receiver Task", (OS_TASK_PTR)receiver_task, (void *)0, (OS_PRIO )RECEIVER_TASK_PRIO, (CPU_STK *)&RECEIVER_TASK_STK[0], (CPU_STK_SIZE)RECEIVER_STK_SIZE/10, (CPU_STK_SIZE)RECEIVER_STK_SIZE, (OS_MSG_QTY )5, (OS_TICK )0, (void *)0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR *)&err); // 创建处理任务(中等优先级) OSTaskCreate((OS_TCB *)&ProcessorTaskTCB, (CPU_CHAR *)"Processor Task", (OS_TASK_PTR)processor_task, (void *)0, (OS_PRIO )PROCESSOR_TASK_PRIO, (CPU_STK *)&PROCESSOR_TASK_STK[0], (CPU_STK_SIZE)PROCESSOR_STK_SIZE/10, (CPU_STK_SIZE)PROCESSOR_STK_SIZE, (OS_MSG_QTY )5, (OS_TICK )0, (void *)0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR *)&err); // 创建发送任务(最低优先级) OSTaskCreate((OS_TCB *)&SenderTaskTCB, (CPU_CHAR *)"Sender Task", (OS_TASK_PTR)sender_task, (void *)0, (OS_PRIO )SENDER_TASK_PRIO, (CPU_STK *)&SENDER_TASK_STK[0], (CPU_STK_SIZE)SENDER_STK_SIZE/10, (CPU_STK_SIZE)SENDER_STK_SIZE, (OS_MSG_QTY )5, (OS_TICK )0, (void *)0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR *)&err); // 删除起始任务自身 OSTaskDel((OS_TCB*)0, &err); } // 发送任务函数 void sender_task(void *p_arg) { OS_ERR err; static CPU_INT16U msg_counter = 0; volatile CPU_INT32U i; // 用于简单延时 while(1) { // 从内存池获取消息缓冲区 APP_MSG *new_msg = (APP_MSG*)OSMemGet(MsgPool, &err); if (err == OS_ERR_NONE && new_msg != NULL) { // 填充消息内容 new_msg->msg_id = msg_counter++; new_msg->data_length = snprintf(new_msg->data, sizeof(new_msg->data), "Message #%d", new_msg->msg_id); // 计算简单校验和 new_msg->checksum = 0; for (int i = 0; i < new_msg->data_length; i++) { new_msg->checksum += new_msg->data[i]; } // 发送消息到处理队列 OSQPost((OS_Q *)&SendQueue, (void *)new_msg, (OS_MSG_SIZE )sizeof(APP_MSG*), (OS_OPT )OS_OPT_POST_FIFO, (OS_ERR *)&err); if (err == OS_ERR_NONE) { // 消息发送成功,闪烁LED0 LED0_ON(); for(i = 0; i < 100000; i++); // 短暂延时 LED0_OFF(); } else { // 发送失败,释放消息内存 OSMemPut(MsgPool, (void*)new_msg, &err); LED0_ON(); // 点亮LED0表示错误 } } // 延迟2秒 OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err); } } // 处理任务函数 void processor_task(void *p_arg) { OS_ERR err; OS_MSG_SIZE msg_size; volatile CPU_INT32U i; // 用于简单延时 while(1) { // 从发送队列接收消息 APP_MSG *received_msg = (APP_MSG*)OSQPend((OS_Q *)&SendQueue, (OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE *)&msg_size, (CPU_TS *)0, (OS_ERR *)&err); if (err == OS_ERR_NONE) { // 闪烁LED1表示正在处理 LED1_ON(); for(i = 0; i < 50000; i++); // 处理消息 process_message(received_msg); // 发送处理后的消息到接收队列 OSQPost((OS_Q *)&RecvQueue, (void *)received_msg, (OS_MSG_SIZE )sizeof(APP_MSG*), (OS_OPT )OS_OPT_POST_FIFO, (OS_ERR *)&err); LED1_OFF(); } // 短暂延迟 OSTimeDlyHMSM(0, 0, 0, 10, OS_OPT_TIME_DLY, &err); } } // 消息处理函数 void process_message(APP_MSG *msg) { // 1. 验证校验和 CPU_INT32U calc_checksum = 0; for (int i = 0; i < msg->data_length; i++) { calc_checksum += msg->data[i]; } if (calc_checksum != msg->checksum) { // 校验和错误,标记消息 snprintf(msg->data + msg->data_length, sizeof(msg->data) - msg->data_length, " [CHECKSUM ERROR]"); msg->data_length += 16; } else { // 2. 处理消息数据 - 转换为大写 for (int i = 0; i < msg->data_length; i++) { if (msg->data[i] >= 'a' && msg->data[i] <= 'z') { msg->data[i] = msg->data[i] - 'a' + 'A'; } } // 3. 添加处理标记 snprintf(msg->data + msg->data_length, sizeof(msg->data) - msg->data_length, " [PROCESSED]"); msg->data_length += 12; // 4. 更新校验和 msg->checksum = calc_checksum; } } // 接收任务函数 void receiver_task(void *p_arg) { OS_ERR err; OS_MSG_SIZE msg_size; volatile CPU_INT32U i; // 用于简单延时 while(1) { // 从接收队列获取消息 APP_MSG *final_msg = (APP_MSG*)OSQPend((OS_Q *)&RecvQueue, (OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE *)&msg_size, (CPU_TS *)0, (OS_ERR *)&err); if (err == OS_ERR_NONE) { // 闪烁LED2表示接收成功 LED2_ON(); for(i = 0; i < 100000; i++); // 打印消息详情 print_message(final_msg); // 释放消息内存 OSMemPut(MsgPool, (void*)final_msg, &err); LED2_OFF(); } // 短暂延迟 OSTimeDlyHMSM(0, 0, 0, 10, OS_OPT_TIME_DLY, &err); } } // 消息打印函数 void print_message(APP_MSG *msg) { printf("\n[RECEIVER] Message %d Details:\n", msg->msg_id); printf(" Length: %d bytes\n", msg->data_length); printf(" Checksum: %u\n", msg->checksum); printf(" Content: %s\n", msg->data); } ``` ## 三任务消息处理系统说明 ### 1. 任务分工 - **发送任务 (Sender Task)**: - 优先级最低 (8) - 每2秒创建一条新消息 - 填充消息ID和内容 - 计算并存储校验和 - 发送消息到处理队列 - 使用LED0指示发送状态 - **处理任务 (Processor Task)**: - 中等优先级 (7) - 从发送队列接收消息 - 验证消息校验和 - 处理消息数据(转换为大写) - 添加处理标记 - 发送处理后的消息到接收队列 - 使用LED1指示处理状态 - **接收任务 (Receiver Task)**: - 最高优先级 (6) - 从接收队列获取消息 - 打印消息详细信息 - 释放消息内存 - 使用LED2指示接收状态 ### 2. 消息队列设计 - **SendQueue**: 发送任务 → 处理任务 - **RecvQueue**: 处理任务 → 接收任务 ### 3. 消息处理流程 ```mermaid graph LR A[发送任务] -->|发送消息| B[SendQueue] B --> C[处理任务] C -->|处理消息| D[RecvQueue] D --> E[接收任务] ``` ### 4. 消息结构体 ```c typedef struct { CPU_INT16U msg_id; // 消息唯一标识 CPU_INT16U data_length; // 数据长度 CPU_CHAR data[50]; // 消息内容 CPU_INT32U checksum; // 数据校验和 } APP_MSG; ``` ## 关键功能实现详解 ### 1. 内存管理 ```c // 初始化内存池 void init_memory_pool(void) { OS_ERR err; MsgPool = OSMemCreate((void*)&MsgMemory[0], MSG_POOL_SIZE, sizeof(APP_MSG), &err); } // 发送任务获取消息内存 APP_MSG *new_msg = (APP_MSG*)OSMemGet(MsgPool, &err); // 接收任务释放消息内存 OSMemPut(MsgPool, (void*)final_msg, &err); ``` ### 2. 消息校验和计算与验证 ```c // 发送任务计算校验和 new_msg->checksum = 0; for (int i = 0; i < new_msg->data_length; i++) { new_msg->checksum += new_msg->data[i]; } // 处理任务验证校验和 CPU_INT32U calc_checksum = 0; for (int i = 0; i < received_msg->data_length; i++) { calc_checksum += received_msg->data[i]; } if (calc_checksum != received_msg->checksum) { // 校验和错误处理 } ``` ### 3. 消息数据处理 ```c // 转换为大写 for (int i = 0; i < received_msg->data_length; i++) { if (received_msg->data[i] >= 'a' && received_msg->data[i] <= 'z') { received_msg->data[i] = received_msg->data[i] - 'a' + 'A'; } } // 添加处理标记 snprintf(received_msg->data + received_msg->data_length, sizeof(received_msg->data) - received_msg->data_length, " [PROCESSED]"); received_msg->data_length += 12; ``` ## 系统特点 1. **健壮的消息验证**: - 校验和验证确保数据完整性 - 错误消息特殊标记 - 内存池管理避免内存碎片 2. **可视化状态指示**: - LED0:发送任务状态指示 - LED1:处理任务状态指示 - LED2:接收任务状态指示 3. **优先级设计**: - 接收任务优先级最高 (6) - 处理任务中等优先级 (7) - 发送任务最低优先级 (8) - 确保消息及时处理 4. **错误处理**: - 校验和错误检测 - 内存分配失败处理 - 消息队列操作错误检查 ## 预期输出示例 ``` [RECEIVER] Message 0 Details: Length: 22 bytes Checksum: 313 Content: MESSAGE #0 [PROCESSED] [RECEIVER] Message 1 Details: Length: 22 bytes Checksum: 314 Content: MESSAGE #1 [PROCESSED] [RECEIVER] Message 2 Details: Length: 38 bytes Checksum: 315 Content: Message #2 [CHECKSUM ERROR] ``` 这个三任务消息传递系统完整实现了消息的创建、发送、处理和接收流程,包含了严格的消息验证和处理机制,并通过LED提供直观的状态反馈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值