急,急,急,WINCE中对平台下的oal层进行修改后无法编译进内核

KDE123 2012-11-22 09:54:00
主要修改了E:\WINCE600\PLATFORM\COMMON\SRC\SOC\S3C6410_SEC_V1\OAL\INTR下的intr.c文件(加了些调试信息),build以后会生成oal_intr_s3c6410.lib,但启动后wince,运行程序并没有变化,我主要的操作是按照编译驱动的方式build的,也注意到它会链接到oal_intr.lib。但还是不知道怎么弄

各位大神求教啊!!
...全文
261 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
KDE123 2012-12-12
  • 打赏
  • 举报
回复
这个问题已经解决了,谢谢上面各位给出的建议,这里出现问题的原因,一个是在这个中断线程中要清ADC中断有关ADCCLRINT寄存器,二是在while(gExitThread)后要再次开启ADC转换,
v_pADCPregs->ADCCON|=0x1; 
,这一位的作用是有一次,意思是说每次中断一次来临后都要去开启它。
lf_kyo 2012-12-04
  • 打赏
  • 举报
回复
" if (i<1000) { buff[i] = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效 i++; }" 1.除了把数据读走,是否还需要其他对寄存器的操作? 2.初始化ADC的部分是否正确? 查查手册
lf_kyo 2012-12-04
  • 打赏
  • 举报
回复
我一般是 1.E:\WINCE600\PLATFORM\COMMON\SRC\SOC\S3C6410_SEC_V1 这个文件夹rebuild 2.build->Advanced->Build and Sub… 还是挺快的。
rickys2080 2012-12-03
  • 打赏
  • 举报
回复
全部rebuild试试
KDE123 2012-11-23
  • 打赏
  • 举报
回复
case 2:的部分可以不看
KDE123 2012-11-23
  • 打赏
  • 举报
回复
要用rebuild and clean sysgen,时间真的很长。调试信息可以出来了。我真正的问题又来了就是关于ADC中断,第一次运行时它能进入中断,并打印出采集的数据。但后面采集的数据就不变了。这是什么原因???代码见下(默认转换是0通道,事件什么的都已经创建,程序的大致意思是等待中断到来,等采集1000个数据后通知应用层读取)
DWORD WINAPI AdcThread (PVOID hdcMain)
{	
	DWORD hstatus;
	//int	preScaler = S3C6410_PCLK/ADC_FREQ -1;
	//Delay(10);
	RETAILMSG(1,(TEXT("adcchoose = %d\n"), adc_flag));
	//v_pADCPregs->ADCCLRINT=1;//清除ADC中断
	//g_pVIC1Reg->VICINTENABLE=0<<30;//屏蔽触摸屏中断
	//RETAILMSG(1,(TEXT("is Interrupt = %o\n"), g_pVIC1Reg->VICIRQSTATUS));
	if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &ADCIRQ, sizeof ADCIRQ, &ADCSysIntr, sizeof ADCSysIntr, NULL))  
	{  
		RETAILMSG(1, (TEXT("ADC: Error! Failed to request sysintr value for ADC  interrupt.\r\n")));  

	}  
	//关联SYSINTR和之前创建的事件  
	if (!(InterruptInitialize(ADCSysIntr, hAdcReadEvent, 0, 0)))   
	{  
		RETAILMSG(1, (TEXT("ERROR: ADC: Interrupt initialize failed.\r\n")));  
	}  
	

	while(g_ExitThread)
	{	
		
		
		hstatus=WaitForSingleObject(hAdcReadEvent, INFINITE);
		if (hstatus == WAIT_OBJECT_0)
		{
		
			switch (adc_flag)//adc_flag是从应用层传过来的
			{
				RETAILMSG(1,(TEXT("In the thread adcchoose = %d\n"), adc_flag));
			case 1:
				{	
					//v_pADCPregs->ADCDAT0=0;
					////v_pADCPregs->ADCCON = (1<<14)|(preScaler<<6)|(1<<3);   //channel 1
					//v_pADCPregs->ADCCON|=0x1;   //start ADC
					//while(v_pADCPregs->ADCCON & 0x1);	//check if Enable_start is low
					if (i<1000)
					{
						buff[i] = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效
						i++;
					}
					else
					{
						i=0;
						SetEvent(hAdcEvent);
					//	Sleep(1);
					}
				/*	i=0;
					SetEvent(hAdcEvent);
					Sleep(1);*/
					//while(!(v_pADCPregs->ADCCON & 0x8000));	//check if EC(End of Conversion) flag is high
					//g_convertervalue = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效
					//RETAILMSG(1,(TEXT("TransAD1 = %d\n"), g_convertervalue));
					//SetEvent(hAdcEvent);//通知应用层.AD转换已经就绪
					break;
				}
			case 2:
				{
					v_pADCPregs->ADCDAT0=0;
					//v_pADCPregs->ADCCON = (1<<14)|(preScaler<<6)|(1<<4);   //channel 1
					v_pADCPregs->ADCCON|=0x1;   //start ADC
					while(v_pADCPregs->ADCCON & 0x1);	//check if Enable_start is low
					if (i<1000)
					{
						buff[i] = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效
						i++;
					}
					else
					{
						i=0;
						SetEvent(hAdcEvent);
					//	Sleep(1);
					}
					//while(!(v_pADCPregs->ADCCON & 0x8000));	//check if EC(End of Conversion) flag is high
					//g_convertervalue = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效
					//RETAILMSG(1,(TEXT("TransAD2 = %d\n"), g_convertervalue));
					//SetEvent(hAdcEvent);//通知应用层.AD转换已经就绪
					break;
				}
			}//switch
		InterruptDone(ADCSysIntr); 
		//SetEvent(hAdcEvent);
		}//if status
	
	}//while

	InterruptDisable(ADCSysIntr);  	//取消Event与ADCSysIntr之间的关联  
	KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&ADCSysIntr,sizeof(UINT32),NULL,0, NULL);  
	return 0;
}
KDE123 2012-11-22
  • 打赏
  • 举报
回复
你说的有道理,但我现在不知道链接了oal_intr_s3c6410.lib,也就是谁依赖了它,那我应该怎么做,用blddemo -qbsp吗,我在论坛上找到了这个帖子 http://bbs.csdn.net/topics/350120042 里面有各位的回答,但好像并没有提出解决方案。怎么弄
David_Hu 2012-11-22
  • 打赏
  • 举报
回复
你要确定是哪个DLL链接了你的oal_intr_s3c6410.lib,确定那个DLL重新编译了
一介布衣萧萧 2012-11-22
  • 打赏
  • 举报
回复
你添加的调试信息没有出来?如果上述编译都不行的话,就用build and sysgen。如果这个都没有效果的话,说明你的程序根本就没有进入到中断处理
KDE123 2012-11-22
  • 打赏
  • 举报
回复
我按照brantyou兄的说法做了,但没有效果呀
一介布衣萧萧 2012-11-22
  • 打赏
  • 举报
回复
先rebuild 一下你的INTR,然后再执行sysgen

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧