-
我选了STM32F103C4T6,不知这个能买到不?
散件行情可以参考淘宝,批量可以咨询代理商。
另外STM32F103C4T6跟 STM32F103C6T6是完全兼容的,如果STM32F103C4T6不好买,也可以买STM32F103C6T6。
-
没看到有标志位。
-
AVR??
ARM??
-
哦,是我搞错了,那个不是型号,不好意思....
-
我这里也有一个 金士顿 的假u盘, 都是仿造的,
问题不好说,可能芯片根本就不对,
也可能是flash芯片的问题,
总之,假的都这样,还不如直接买一个清华同方的,人家直接告诉你这个就是山寨的
-
我用u-boot调arm,是通过串口下载后,进行调试的(u-boot本身就支持,at91rm9200串口可引导)
问题是如果你能实现串口下载,并load起来,您的boot程序也就基本差不多。
-
赞一个 Veron_04
-
首先是来自http://blog.eeworld.net/wenddy112/articles/300583.aspx上的一个问题:
对于下面的结构体
struct test
{
char x1;
short x2;
float x3;
char x4;
};
结构各成员空间分配情况是怎样的?
文章中解释:
结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在 test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了 3个空字节。整个结构所占据空间为12字节。
同时,说明了更改C编译器的缺省字节对齐方式: 在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
另外,还有如下的一种方式:
· __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
· __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。
下面是eeworld上提出的问题(原文:http://community.eeworld.net/Expert/TopicView3.asp?id=3804035)
---------------------------------------
#pragma pack(8)
struct s1{
short a;
long b;
};
struct s2{
char c;
s1 d;
long long e;
};
#pragma pack()
问
1.sizeof(s2) = ?
2.s2的c后面空了几个字节接着是d?
---------------------------------------
下面是redleaves(ID最吊的网友)给出的解释:
很详尽,很透彻,从论坛原文后头的对话可以看出redleaves对C/C++的标准理解很深刻,值得偶学习:)
#pragma pack(8)
struct S1{
char a;
long b;
};
struct S2 {
char c;
struct S1 d;
long long e;
};
#pragma pack()
sizeof(S2)结果为24.
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;
S2 中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.
a b
S1的内存布局:11**,1111,
c S1.a S1.b d
S2的内存布局:1***,11**,1111,****11111111
这里有三点很重要:
1.每个成员分别按自己的方式对齐,并能最小化长度
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐
对于数组,比如:
char a[3];这种,它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
如果写: typedef char Array3[3];
Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.
不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64....中的一个.
下面是从另外一篇文章(http://community.eeworld.net/Expert/TopicView3.asp?id=3564500)的一些对各个类型以及结构体对齐方式的补充:
为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,即起始地址能够被4整除。变量的对齐规则如下(32位系统):
Type
Alignment
char
在字节边界上对齐
short (16-bit)
在双字节边界上对齐
int and long (32-bit)
在4字节边界上对齐
float
在4字节边界上对齐
double
在8字节边界上对齐
structures
单独考虑结构体的个成员,它们在不同的字节边界上对齐。
其中最大的字节边界数就是该结构的字节边界数。
如果结构体中有结构体成员,那么这是一个递归的过程。
设编译器设定的最大对齐字节边界数为n,对于结构体中的某一成员item,它相对于结构首地址的实际字节对齐数
目X应该满足以下规则:
X = min(n, sizeof(item))
例如,对于结构体
struct {
char a;
long b;
} T;
当位于32位系统,n=8时:
a的偏移为0,
b的偏移为4,中间填充了3个字节, b的X为4;
当位于32位系统,n=2时:
a的偏移为0,
b的偏移为2,中间填充了1个字节,b的X为2;
结构体的sizeof:
设结构体的最后一个成员为LastItem,其相对于结构体首地址的偏移为offset(LastItem),其大小为sizeof(LastItem),结构体的字节对齐数为N,则:结构体的sizeof 为: 若offset(LastItem)+ sizeof(LastItem)能够被N整除,那么就是offset(LastItem)+ sizeof(LastItem),否则,在后面填充,直到能够被N整除。
另外:
1) 对于空结构体,sizeof == 1;因为必须保证结构体的每一个实例在内存中都有独一无二的地址.
2) 结构体的静态成员不对结构体的大小产生影响,因为静态变量的存储位置与结构体的实例地址无关。例如:
struct {static int I;} T; struct {char a; static int I;} T1;
sizeof(T) == 1; sizeof(T1) == 1;
要想更进一步了解编译器对结构体及各变量对齐方式的处理,尤其是变量及结构体大小的用法(sizeof的用法)
推荐阅读下面一篇文章(可惜没有下篇:():
:http://blog.eeworld.net/freefalcon/archive/2004/07/28/54839.aspx
-
友情帮顶下。
MARK.
-
引用 12 楼 wangxin_801115 的回复:
引用 10 楼 sunrain_hjb 的回复:
这两天也在调试电源管理的驱动。我的理解,进入useridle和systemidle时是不需要唤醒的,一般在这两种状态下是关闭了LCD背光而已。只有进入Sleep或者Suspend时,系统才真正进入休眠,也才需要被唤醒。唤醒一般是通过外部按键实现的,应该不会是事件。
我这里说的唤醒并不是指将CPU从DEEP SLEEP中唤醒
我是说关掉背光、关掉LCD后
当我按TOUCH或者KEYBOARD PRESS DOWN 或者USB insert 或者SDCARD insert 再重新点亮屏的这一过程
是怎么做的
是通过事件通知系统进入busy状态的吗??
这个只要在背光驱动里处理IOCTL_POWER_SET即可,D0时背光全亮,D1时背光微亮,D2时关闭背光,D3就是休眠了。
从D2、D1到D0,不需要程序通知系统,有触屏或者其他交互操作,系统会自动进入D0状态的。
-
谢谢各位!
to zixuanzimo:
把地址改成30000000后,dnm会卡在下载那,不能运行了。
to cfanlwn:
我想重新下载一边bootloader,但是使用原来的bootloader不能下载,还是提示checksum出错。有什么强制重新更新bootloader的方法么?
我搜了很久帖子了,也有人遇到checksum出问题的,但是问题没解决就结贴了。。。
谢谢大家!!!
-
可以把myap.exe设置成开机自动运行,检测当SD卡插入并且有相应文件存在的时候就提醒用户是否更新,至于更新的那些代码就是标准的文件copy等函数了。
版本新旧比较的话可以通过在一个特定的文件里写下应用程序的版本号(不知道程序能不能直接读取exe本身的版本号,如果可以的话就更方便了)
-
引用 9 楼 eastley 的回复:
引用 8 楼 guopeixin 的回复:
引用 7 楼 eastley 的回复:
引用 5 楼 guopeixin 的回复:
引用 4 楼 guopeixin 的回复:
samsung flash驱动设计的问题,采用了所有r/w操作经由kerneliocontrol转接到oal的方式,所以优先级比较高,导致操作flash的时候系统cpu loading很高
如果想解决这个问题,可以改一下架构或者采用ms 的driver
另外,你点击触摸屏没有反应的时候,可不可以做如下尝试
1. 拷贝文件之前,在device上运行一个测试程序,如播放对象存储中音频文件的播放器,当触摸屏没有反应的时候看测试程序能够正常工作;
2. 在touch driver中每次检测到用户点击的时候输出log信息,看触摸屏没有反映的时候是否有中断的log信息输出
谢谢,1、如果如你所说,我把SD卡上的数据拷贝到Pocketmory1时,系统是正常的,又如何解释?
? ? ? 2、先打开SD卡上的音频文件播放,通过USB Mass Storage拷贝数据到Nand时,音频播放会停在那里,直到拷贝完成才继续播放。
to:1、如果如你所说,我把SD卡上的数据拷贝到Pocketmory1时,系统是正常的,又如何解释?
在没有看到所有线程对cpu占用的具体时间之前所有的分析都是推测
这个应该是SD卡和Mass Storage情况下USB速度的差异导致拷贝文件的时候用在flash Write上的时间长短有关
另外,“2. 在touch driver中每次检测到用户点击的时候输出log信息,看触摸屏没有反映的时候是否有中断的log信息输出”的结果是?
To:1:是的,我现在确实都只是根据表象来推测;
? 2:把触摸屏驱动打印LOG打开,发现是有LOG输出的,虽说不是很流畅,打印如下:
DdsiTouchPanelGetPoint:: *pUncalX=2959, *pUncalY=1888
up
*pUncalX=2959,*pUncalY=1888
那就基本上可以确定是优先级导致的该问题,解决方法如前面说的
不过,其实这个也不算是啥问题,因为连接usb的时候用户基本上不可能同时做这么多的操作
-
PB5 打补丁就会有了
-
那可能是OSCTXSW函数的位置超过了跳转指令的寻址范围
-
呵呵,他是USB2.0转485吧
-
解决了,我也有类似的问题,删除了哪行代码??
-
之的信息主要说明发送了如下命令:
CMD5-CMD0-CMD55+ACMD41-CMD0-CMD55+ACMD41-CMD2-CMD3-CMD9-CMD13-CMD7-CMD55+ACMD51-CMD55+ACMD42-CMD55+ACMD6。
由于比较长,所以,没法弄上来,
WaitForSingleObject--m_hResponseReceivedEvent is been treg
*(vm_pSDIReg->SDIRSP0) = 0x920
__IST___TransferIstThread_Here is TRANSFER_DONE
___STATUS___ SDIO_Interrupt_Disabled
-/-/-/SDHCB:Get_SDI_Bus_Width m_dwSDIBusWidth = 0x0
-/-/-/SDHCB:Stop_SDI_Clock
After clear SD_RINTSTS=0x 0
After clear SD_CTRL=0x 10
End of TransferIstThread SD_STATUS=0x 3106
---FiveHandler--- SDHCDSlotOptionHandler starts
SDHCDSlotOptionHandler option=SDHCDSetSlotInterface
??????InterfaceMode = 0
-/-/-/SDHCB:Set_SDI_Bus_Width_1Bit
^=^=^=^=^Here enable SetClockRate in SlotOptionHandler,because SDCLOCK cannt reach 25MHZ.If set CLk 25Mhz,it will tell kernel error
-/-/-/SDHCB SetClockRate start, dwClockRate = 0xbebc20
In SetClockRate SD_APBCLKDIV = 0xe,
dwClockRate=12500000
******SetClockRate dwPrescale = 0x0; dwActualRate = 0x57316d
Before fClockIsRunning SD_CLKENA = 0x0
-/-/-/SDHCB:Is_SDI_Clock_Running SD_CLKENA = 0x0
After fClockIsRunning SD_CLKENA = 0x0
fClockIsRunning= 0
SDHCD:SetClockRate() - Clock rate set to 5714285 Hz
SDHCD:SetClockRate() -This is end
---FiveHandler---SDHCDSlotOptionHandler ends
~_~_~_~_~SDMemory: DLL_PROCESS_ATTACH
~_~_~_~_~SDMemory: +SMC_Init
~_~_~_SDMemCalcDataAccessClocks: Tpd:f ns, Asynch: f ns, AsyncClocks:0 , SyncClocks: 1080418304, ReadTotal: 0, Write Factor:
1094116192 WriteTotal: 8571
~_~_~_SDMemory: Power Management Setup complete
~_~_~_~_~SDMemory: -SMC_Init
~_~_~_~_~SDMemory: +-SMC_Open
~_~_~_~_~SDMemory: +SMC_IOControl
~_~_~_~_~SMC_IOControl: Recevied IOCTL 3280896 =~_~_~**UNKNOWN**
~_~_~_~_~SDMemory: -SMC_IOControl returning 1
~_~_~_~_~SDMemory: +-SMC_Open
~_~_~_~_~SDMemory: +-SMC_Close
~_~_~_~_~SDMemory: +-SMC_Open
~_~_~_~_~SDMemory: +SMC_IOControl
~_~_~_~_~SMC_IOControl: Recevied IOCTL 1 =~_~_~DISK_IOCTL_GETINFO
~_~_~_~_~SDMemory: -SMC_IOControl returning 1
~_~_~_~_~SDMemory: +SMC_IOControl
~_~_~_~_~SMC_IOControl: Recevied IOCTL 464896 =~_~_~IOCTL_DISK_DEVICE_INFO
~_~_~_~_SDMemory: GetDeviceInfo - Profile = SDMemory, length = 18
~_~_~_~_~SDMemory: -SMC_IOControl returning 1
~_~_~_~_~SDMemory: +SMC_IOControl
~_~_~_~_~SMC_IOControl: ReceviSEP0718DISP::InitializeHardware
ed IOCTL 465956 =~_~_~IOCTL_DISK_GET_STORAGEID
~_~_~_~_SDMemory: +GetStorageID
~_~_~_~_~SDMem+OALIntrRequestSysIntr(1,ory: -SMC_IOControl returning 0
~_~_~_~_~SDMemory: +SMC_IOControl
~_~_~_~_~SMC_IOControl: R 0xc0565090, 0x00000000)
-OALIntrRequestSysIntr(irq = 1, sysIntr = 19)
+OALIntrRequestSysIntrecevied IOCTL 465956 =~_~_~IOCTL_DISK_GET_STORAGEID
~_~_~_~_SDMemory: +GetStorageID
~_~_~_~_(1, 0xc0565094, 0x00000000)
-OALIntrRequestSysIntr(irq = 18, sysIntr = 20)
+OEMInterruptEnable(19, 0x0, 0)
+OALIntrEnableIrqs(1, 0x80a066f4)
+BSPIntrEnableIrq(1)
-BSPIntrEnableIrq(irq = 1)
-OALIntrEnableIrqs(rc = 1)
-OEMInterruptEnable(rc = 1)
+OEMInterruptEnable(20, 0x0, 0)
+OALIntrEnableIrqs(1, 0x80a066f8)
+BSPIntrEnableIrq(18)
-BSPIntrEnableIrq(irq = 18)
-OALIntrEnableIrqs(rc = 1)
-OEMInterruptEnable(rc = 1)
Maximum AlloweSDMemory: -GetStorageID
~_~_~_~_~SDMemory: -SMC_IOControl returning 1
~_~_~_~_~SDMemod Error 7:
ry: +SMC_IOControl
~_~_~_~_~SMC_IOControl: Recevied IOCTL 465920 =~_~_~IOCTL_DISK_GETINFO
~_~_~_~_~SDMemory: -SMC_IOControl returning 1
~_~_~_~_~SDMemory: +SMC_IOControl
~_~_~_~_~SMC_IOControl: Recevied IOCTL 482312 =~_~_~IOCTL_DISK_READ
~_~_~_SDMemory: +SDMemRead
~_~_~_SDMemRead: Reading blocks 0-0
BlockTransferSize = 30, NeedToTransfer = 1
~_~SDMemReadMultiple: Reading blocks 0-0
~_~SDMemDoBusRequest: CMD17 Arg 0x00000000 TransferClass 0 NumBlocks 1 BlockSize 512
////////////////////////////////////(CMD:17)//////////////////////////
---FiveHandler---BusRequestHandler starts (CMD:17)
-/-/-/SDHCB:Start_SDI_Clock
!!Alert!!!!!Alert!!! Here Set the Bus Width, move from SetupPollingXfer/SetupDmaXfer
-/-/-/SDHCB:Get_SDI_Bus_Width m_dwSDIBusWidth = 0x0
!!Alert!!!!!Alert!!! Here enable SetupDmaXfer,disable SetupPollingXfer/
pBlockBuffer=0xd0410008,m_dwNumBytesToTransfer=0x 200,
-/-/-/SDHCB SetupDmaXfer started
Here in case SD_READ
-/-/Stop_SDIO_DMA_Channel/-/!!!Alert!!!Alert!!! SEP0718 dont have such function,here use reset DMA instead
Last in SetupDmaXfer SD_CTRL =0x30
Last in SetupDmaXfer--DMACC0Control=0x 2024ad ,DMACC0Configuration=0x 38c
---CmdType---this is SD_WRITE or SD_READ
BLKSIZ = 0x200
|-|-|-|-SendCommand (0xd002c980,Cmd= 17, Arg=00000000, respType=0001, 0x1) starts
respType short response required,right now SD_CMD =0x 3200
SD_CMD =0x 3351
........SendCommand end
After SendCommand,SD_RINTSTS=0x 24
After SendCommand,SD_STATUS=0x80208d09
WaitForSingleObject--m_hResponseReceivedEvent is been treg
*(vm_pSDIReg->SDIRSP0) = 0x900
***0-1*****Most important DMACIntTCStatus0=0x 0
-/-/Enable_SDIO_DMA_Channel/-/--Here we only configure DMA0 Channel,DMACC0Control=0x 1c24ad ,DMACC0Configuration=0x 38d
***0-2*****Most important DMACIntTCStatus0=0x 0
Here after Enable_SDIO_DMA_Channel--DMACC0Control=0x 24ad ,DMACC0Configuration=0x 38c
-/-/-/SDHCB:Get_SDI_Bus_Width m_dwSDIBusWidth = 0x0
Before WaitForSingleObject DMACIntTCStatus0=0x 0
After WaitForSingleObject DMACIntTCStatus0=0x 0
OK OK OK we pass the DMA Intr
-/-/Stop_SDIO_DMA_Channel/-/!!!Alert!!!Alert!!! SEP0718 dont have such function,here use reset DMA instead
//////MemCopy SD_READ,Do it now,pBlockBuffer = 0xd0410008
***5*****Most important SD_RINTSTS=0x 45ac
m_pDMABuffer=0xd03d0000, m_pDMABufferPhys=0x3250e000
*********m_dwNumBytesToTransfer= 0x200,pBlockBuffer0= 0xeb,pBlockBuffer1= 0x58
eb 58 90 4d 53 44 4f 53 35 2e 30 0 2 8 24 0 2 0 0 0 0 f8 0 0 3f 0 ff 0 0 0 0 0 0 46 1e 0 8e 7 0 0 0 0 0 0 2 0 0 0 1 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52 f0 63 43 70 9c 9e 40 9c 82 9a 8a 40 40 40 40 8c 82 a8 66 64 40 40 40 67 93 1d a3 79 e8 f7 1d 83 1d b3 7a 0 f9 10 9c 5 14 ac 81 68 11 9a 26 e6 b 73 ff ff 15 e2 cc 1f 6d 8c 80 cc 1f 6d a3 1 c4 7f ef c5 d 9b 81 da c 82 cc 1f 6f 92 cd ef c2 cd 12 8d f1 6 fc 2c 0 ea 71 6 fc 54 0 ee 64 cd 16 8c 38 cd 7 80 19 76 1 1 72 2 1 d0 56 1 d2 90 7 41 f4 fb 68 fb 17 e1 59 9 80 e8 2e 79 fe e8 13 68 1d 76 e 1 9a 21 d7 dd 41 f6 fb d7 cb 41 f2 fb d7 c1 31 9a 2d 9a 32 cc c0 cc 76 8d f0 1f 4 94 0 cc d4 0 cc a0 c a6 cc d0 20 0 2 1 0 fc 4 0 1f a 40 1 68 83 77 54 ab 14 ac 81 9a 26 1f 4 38 1 3 f6 ab 54 1f a 28 1 ed 82 2 1f 8 1a 1 fc 8c 5 68 85 14 ac 81 17 e9 9a 27 61 f2 cc b0 cc b0 cc b0 cc b1 d6 54 cc 67 a4 cc 1f 6e 9c 30 cd ef e3 fd 85 15 94 cd 17 a0 cd 83 d4 21 ee ec 35 d ad 14 ac 81 15 d1 81 c8 c 15 99 70 2 5 9a 26 cc c2 1f 4 a9 ff 3 86 0 4 cc 80 92 1f a e3 ff 86 9c a8 98 88 a4 40 40 40 40 40 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1a 14 a4 ca da de ec ca 40 c8 d2 e6 d6 e6 40 de e4 40 de e8 d0 ca e4 40 da ca c8 d2 c2 5d fe 1a 14 88 d2 e6 d6 40 ca e4 e4 de e5 fe 1a 14 a0 e4 ca e6 e6 40 c2 dc f2 40 d6 ca f2 40 e8 de 40 e4 ca e6 e8 c2 e4 e8 1a 14 0 0 0 0 1 59 97 b0 0 0 ab 55
here is end of data__IST___TransferIstThread_Here is TRANSFER_DONE
___STATUS___ SDIO_Interrupt_Disabled
-/-/-/SDHCB:Get_SDI_Bus_Width m_dwSDIBusWidth = 0x0
-/-/-/SDHCB:Stop_SDI_Clock
After clear SD_RINTSTS=0x 0
After clear SD_CTRL=0x 10
End of TransferIstThread SD_STATUS=0x 8906
---FiveHandler---BusRequestHandler ends
~_~_~_SDMemory: -SDMemRead
~_~_~_~_~SDMemory: -SMC_IOControl returning 1
~_~_~_~_~SDMemory: +SMC_IOControl
~_~_~_~_~SMC_IOControl: Recevied IOCTL 482312 =~_~_~IOCTL_DISK_READ
~_~_~_SDMemory: +SDMemRead
~_~_~_SDMemRead: Reading blocks 0-0
BlockTransferSize = 30, NeedToTransfer = 1
~_~SDMemReadMultiple: Reading blocks 0-0
~_~SDMemDoBusRequest: CMD17 Arg 0x00000000 TransferClass 0 NumBlocks 1 BlockSize 512
-
什么液晶啊。也不说直接接上去,会显示才是奇怪呢。
-
引用 37 楼 csdeny 的回复:
基本是编译器优化的原因,看看汇编代码就知道了
不太可能是速度的原因
怎么生成和查看汇编代码的?老兄?