嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 Q1 X( V; S: q0 N" K

( z7 x" C! X# T' WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 U: `* T/ I! ^' L% O, S. W#include <unistd.h>
4 c8 }0 t% u( C  n" J7 \2 i: I2 E#include <sys/mman.h>* I* v' L7 u" R! Q: a
#include <sys/types.h>
# l4 k) q" c2 |8 ^, S#include <fcntl.h>
5 T7 X1 O1 o$ ]6 E7 @6 o  r
2 X( }7 {( D  m) \9 t: A+ e+ }' {8 t#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 d, v2 Y# F! N& \1 z. R
' F" c% i$ u" ~# |typedef struct$ y% T6 D+ n9 G
{
' ?* P% s$ D! A4 f$ m+ t        unsigned int a;1 P% L% F% `- c
        unsigned int b;9 m6 l2 Z  i  D3 a! b) [4 c
        unsigned int packet_cout;% C0 A2 d* P' I6 f; w4 i0 ~9 V* M& v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 o. C6 i3 K) {2 M/ V2 u' e2 Z" n- c, A- ~6 v$ Q  P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  g( N: B0 P+ O/ A* _unsigned int count_copy = 0;
' i/ H& j+ |" ?3 J, }4 a8 E
, i1 m: x" Z1 V' [
: d. \# ?1 V9 ?int main()( H4 i7 e* x) A+ ^% Q) t
{
% U: p/ C; l: A) ~        pRX_MSG_PROTOCOL pshreRAM = NULL;+ q2 n# ^& R7 h+ P$ h5 V* |2 G5 H0 r! E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ K$ V. L) I% o. e: N
3 f7 V7 l5 `* n0 f7 z        while(1)4 @) N5 o% W4 X1 s1 `
        {
  M% d" e% o+ f                read_MSG_buffer(pshreRAM);
  c! h4 A9 ~! V  x& o( V        }               
5 K3 K  r3 b7 J( q}
( D' d& z3 y3 |1 \, x
0 B/ K, {# {8 M% p$ x' ^8 O' cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 l% ]1 g+ z' W5 f* F+ P* R
{
4 y' i9 M, P# M% T1 ]) i        RX_MSG_PROTOCOL buf;
0 u0 D/ z' j" m8 r        / V6 {3 U8 ]7 Q. u
        buf.a = pshreRAM->a;
6 e$ G. V  |9 D        buf.b = pshreRAM->b;
* E) A: A, G1 f* [0 E' c% Q        buf.packet_cout = pshreRAM->packet_cout;( K+ t7 z0 ^& U! T3 W" {: g
        
" F" ?6 C4 Z& g0 M4 E8 ?4 n! N, R        if(buf.packet_cout != count_copy)7 Z, [6 y$ L# B; w' z$ |6 Y
        {: J' A" C; e( D# ~' t- x& Y
                printf("a is %d\n", buf.a);: t* _' l( ~, k! Y$ W
                printf("b is %d\n", buf.b);
; O. }; d  l. L' @. E  I. ^                printf("count is %d\n", buf.packet_cout);" [; Z( m3 d. j4 A: |
                count_copy = buf.packet_cout;, C  o' ?$ c3 O: f
        }
9 F! n7 C/ G' ^3 M& ]) \        else
+ P; V, X% G* j0 |  h        {+ a& P% H- |9 a  `- n8 E8 S/ W! Z
                printf("No effective message!");
  r6 {2 ?& o- F3 N6 h        }; Z. y7 ?9 g" k
}
  w9 G7 z! W- ?. L' v+ c
  s# p) `3 O: w8 C5 _/ Q0 X0 {5 |/ C
5 v- O, t. _: n$ J, ]9 Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 ?3 a6 V' o+ e7 e6 Y
使用下面代码,对内存使用了mmap函数后:
8 N! D2 ~7 A; v1 `$ X3 h#include <stdio.h>
5 E( q- v( ^, m$ m  t( O#include <unistd.h>
9 }2 @7 V4 Y2 G2 _#include <sys/mman.h>/ ~$ p* }, ^, _+ Y* B3 @
#include <sys/types.h>8 E. v0 v$ @# P1 d
#include <fcntl.h>
( q( s6 G7 K5 B0 A5 Y' J
5 _) [( J$ |& f7 i& a5 N; {" R0 }' K#define SHAER_RAM_BASE_ADDR    (0x80000000)
& Y3 F, e7 v: Y1 K5 D1 D#define SHAER_RAM_SIZE         (0x20000)   
* i. v7 b  y8 o" `8 X& _4 {% \8 s9 a
typedef struct8 g+ w. H/ ^) _) |4 E# M( v
{
8 x' W* _1 B  Z/ k9 i( H        unsigned int a;. S" j* _% Z- _& ~1 e
        unsigned int b;
7 @6 O3 t' I' S' W6 M% }6 o# l        unsigned int packet_cout;
+ ]7 O4 D" N& n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% W9 n- Z" p8 B  p

2 X9 U% I  ~' f% c- S- Z& Q, jvoid read_MSG_buffer(int *baseaddr);' F; b4 g9 o! ~$ A9 W
unsigned int count_copy = 0;
0 Q2 `  Q3 I3 w
4 i: Y, n" n( n2 a: Bint main()8 i" z& R9 C' @& w& o  P
{
* u& F0 ~6 y* u' C, O( H        int fd;
2 Z! d7 f# z5 i2 H        int *mem = NULL;3 g' e  N+ R2 v. l* q

# S9 P3 D* [  v) ^7 q7 u        if((fd = open("/dev/mem", O_RDWR)) <0)/ a9 s) C- d! v
        {
* u# r- U' u; n" ]. I5 q. k                perror("open error");2 t) D+ Z) g' S) _  v2 S2 W& b5 U
                return -1;: o4 y, C+ b+ _9 h2 O3 @0 R+ z, l6 s
        }
$ m8 ]5 s5 i9 c  U4 a$ x  P* ~" `- }        & ]! S! t5 S, L
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ a: J6 n' ~5 U- J
' f" _" Q- B' ~. v% `% \        while(1)& P7 z- }( |, l. G) K: l- p$ z
        {
( P) W0 H/ s+ y, U                read_MSG_buffer(mem);% o& r8 F& S6 ^' l* G9 o, g% F
        }                ( b$ w' @5 A" g4 m/ ?
}
& m; V2 d- t  T( }9 x% c6 ~" S
void read_MSG_buffer(int *baseaddr)
, k; A( _& V3 }, E- A{: k8 \8 p% x( S: q8 ^  B# L
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' u! E+ r$ J9 k6 P( X7 u: J7 e/ Z+ E, O# l2 B+ O
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 @! U7 g/ l7 I- w8 p2 g9 {) C/ y, m
% s3 q" y& G, B$ I" B, O( G        if(pshreRAM->packet_cout != count_copy)8 W0 }, T/ I; s3 `! i6 M. v
        {: M4 F9 f. n5 U
                printf("a is %d\n", pshreRAM->a);% l" z( Q. ?) d! ~2 U' y
                printf("b is %d\n", pshreRAM->b);  G  B& [7 C  h
                printf("count is %d\n", pshreRAM->packet_cout);
" r" [3 E# Y1 ^8 b                count_copy = pshreRAM->packet_cout;
9 t& |: u6 p$ \1 L' s        }. O" y9 u% f# `; ~# q9 `
        else
. L3 S" P  w5 E        {
  w* C5 o  u2 k# }' M                printf("No effective message!\n");& V5 o4 L- E6 `( y: q: L. R6 }- \
        }* k8 W$ R" G) L5 W8 X- D) Q
}0 H- E$ Z; g' p' a( g

- {3 ^4 c2 G9 u! q6 K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& ^9 c( G( S( z6 n3 ]" E) f5 w

' L; a- h% u) e+ N$ d; q' _9 ^7 o) F
: H- E5 j! m* c! X
, E; G) d4 R4 s# q; Q  ?) i6 C, N; x9 Y# [; j8 Y7 W6 I





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4