⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex10.c

📁 51单片机上可以使用的操作系统
💻 C
字号:
//
// example 10: This example Plays original sound on OS, explain how to Play sound on OS.
// author: Taiyun Wang 
// date:2003/2/22
///////////////////////////////////////////////////////////////////////////
#include "sposvar.h"
#include "spos.h"

#define BUFLEN 60
#define BUFSIZE 2

extern long RES_ORIG2_RAW_SA;
extern long RES_ORIG2_RAW_EA;


unsigned int* pStart;
unsigned int* pEnd;
int SegStart;
int SegEnd;
int playpointer = 0;			
int playbuf = 0;

int buff[BUFSIZE][BUFLEN];		//sound buffer

int err;						//Error No
int t1stack[32];				//Task 1 stack
int t2stack[20];				//Task 2 stack
HEvent sem;						//Event handle

volatile unsigned int *P_IOB_BUFFER =(unsigned int*)(0x7006);	//Port B data register
volatile unsigned int *P_IOB_DIR =(unsigned int*)(0x7007);		//Port B direction register
volatile unsigned int *P_IOB_ATTRIB = (unsigned int*)(0x7008);	//Port B attribute register


volatile unsigned int* P_DAC_Ctrl = (unsigned int*) 0x7015;		//DAC control register
volatile unsigned int* P_DAC1 = (unsigned int*) 0x7017;			//DAC1 data register
volatile unsigned int* P_DAC2 = (unsigned int*) 0x7016;			//DAC2 data register

void int_func(void);			//interrupt function

main()
{
	void Task1();
	void Task2();
	void DACInit();
	SpSInit();
	*P_IOB_DIR = 0XFFFF;									//Set Port B direction
	*P_IOB_ATTRIB = 0XFFFF;									//Set Port B attribute 
	DACInit();
	*P_DAC1 = 0x0;
	*P_DAC2 = 0x0;
	
	err = SpSTaskCreate(Task1,(void*)0,t1stack+31,1);		//Create first task
	err = SpSTaskCreate(Task2,(void*)0,t2stack+19,2);		//Create second task
	sem = SpSSemCreate(0);
	SpSStart();												//Start OS kernel
}
void DACInit()
{
	pStart =    (unsigned int *)(int)RES_ORIG2_RAW_SA;		//Start pointer
	pEnd =      (unsigned int *)(int)RES_ORIG2_RAW_EA;		//End pointer
	SegStart =  (unsigned int)(RES_ORIG2_RAW_SA>>6)&0xFC00;	//Start segment
	SegEnd =    (unsigned int)(RES_ORIG2_RAW_EA>>6)&0xFC00;	//End segment
	SpFSetTimer(OS_SET_TIMEA,0x0030,0xFA23);
}
void Task1()
{
	int fillbuf(int buffno);
	int ret;
	fillbuf(0);
	fillbuf(1);
	SpSSetVector(FIQ_TMA_VEC,int_func);
	SpFAddINTVec(FIQ_TMA_EN);
	while(1) {
		SpSSemPend(sem,0);
		ret = fillbuf(((unsigned int)(playbuf-1)%BUFSIZE));
		if(ret) {
			SpSTimeDly(1);
			SpFDelINTVec(FIQ_TMA_EN);
			*P_DAC1 = 0x78f0;
			*P_DAC2 = 0x78f0;
			SpSTaskExit();
		}
	}
}
void Task2()
{
	unsigned int i = 1;
    while(1) {
		*P_IOB_BUFFER = i;
		i<<=1;
		if(i == 0x0100)
			i = 1;
		SpSTimeDly(20);
	}
	
}
void int_func(void)
{
	
	*P_DAC1 = (unsigned char)buff[playbuf][playpointer];
	*P_DAC2 = (unsigned char)buff[playbuf][playpointer++];
	if(playpointer == BUFLEN) {
		playbuf = (unsigned int)(playbuf+1)%BUFSIZE;
		playpointer = 0;
		SpSSemPost(sem);
	}
}
int fillbuf(int buffno)
{
	int i;
	unsigned int tmp;
	__asm__("INT OFF \n\t"								//Set data segment
			"SR = SR AND 0x03FF \n\t"
			"SR = SR OR %0"
			:
			:"m"(SegStart)
			);
	SpSEnableINT();										//Enable interrupt
	for(i = 0;i <= BUFLEN;i++) {
		__asm__("%0 = D:[%1] \n\t"						//Read sound data to tmp
				:"=r"(tmp)
				:"r"(pStart)
				);
		pStart++;
		buff[buffno][i] = tmp;
		if((pStart >= pEnd)&&(SegStart == SegEnd))		//Play finished
			return 1;
		if(pStart == (void*)0) {
			SegStart+=0x0400;
			__asm__("INT OFF \n\t"						//Set data segment
					"SR = SR AND 0x03FF \n\t"
					"SR = SR OR %0"
					:
					:"m"(SegStart)
					);
			SpSEnableINT();
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -