嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! L5 |9 H5 v) Z# T+ i* S# E0 T7 [5 y: {1 L: u. e  H" v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 z' i; ~! P+ D% u) U" s# g
#include <unistd.h>$ D2 f9 q7 @* b$ j3 A
#include <sys/mman.h>
" Y9 M. s3 A4 z#include <sys/types.h>6 _9 j6 n5 D! P* y8 `5 d3 c
#include <fcntl.h>$ L6 D/ K5 s0 `  t8 C1 G# x6 [* u
9 l/ f, O7 _$ ]. ^4 M5 t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % ^+ A+ w; g  x  P; {- C

  T8 K- B+ ^, \, J0 @# m1 Q, rtypedef struct( c3 s5 p" [" _0 ~: z
{/ L5 `$ _6 M" ~: W' k8 e) @7 L# E
        unsigned int a;
- n" j( i4 i1 e7 G, H0 B# v        unsigned int b;
  T1 Y9 Z) `$ `( V1 C! j% `& L        unsigned int packet_cout;
; A6 R# P( t# ~, F- V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 ]3 d& X  R" Q0 i
, v2 a& L6 C% o6 d' [4 H. d4 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# P( M; T) V8 u6 yunsigned int count_copy = 0;
9 c5 R8 J! k7 v% u7 J* {# `; g$ D/ f" ~, t3 B/ Q, j/ |* Q

% }9 O/ j' P  U$ [* l6 ?. kint main()
% c( E5 o7 j# ]! F  S5 o7 b8 f; N3 Q{
4 x" h( J4 {2 q+ ~        pRX_MSG_PROTOCOL pshreRAM = NULL;9 @8 w, _1 d" ?8 Z5 ^2 P6 Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) n( H5 p$ b  Z+ n6 f- r+ P2 B
2 X  ?2 z0 s2 k! k: m/ Z  p        while(1)3 R3 w3 p" N5 y2 C) Q7 h, O
        {
7 M8 U; {- j) \( x                read_MSG_buffer(pshreRAM);
9 `" K/ B# o& k, [/ ?        }               
: M" L: r0 ]* c}- p2 r% H) ~1 T3 p& S7 d6 T
6 ?9 ~! \2 B) t8 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 D/ y8 K( w  V: ^8 i7 L
{/ b7 x$ I6 S$ r: [6 ]+ a1 _
        RX_MSG_PROTOCOL buf;. {# C' X* n- c' b/ I4 i' N
        
9 Z4 H# @: y4 h4 A        buf.a = pshreRAM->a;( @6 ^" n: b+ i# F" F
        buf.b = pshreRAM->b;
5 v% E5 F9 ]" |! I. U% y" S: n        buf.packet_cout = pshreRAM->packet_cout;
5 Q9 G" _6 m- X  v( w2 T        
' i6 R' a9 p2 l6 M# ^# M        if(buf.packet_cout != count_copy)% p% w, m. I+ n6 D6 j, A' _$ o  E6 z
        {6 s9 R5 J( x% U/ E. T* J
                printf("a is %d\n", buf.a);
: t2 e$ \! {$ J: u                printf("b is %d\n", buf.b);" R* T% m, Q, m8 F
                printf("count is %d\n", buf.packet_cout);" Z( R  c. x: U% W
                count_copy = buf.packet_cout;& F# t4 ]: m* J3 m7 @8 k5 s
        }
3 Y1 j% B& I0 l0 k        else
) h2 h$ G5 S8 G& t" n) `- L& L        {
. h& b  g1 |. x; o                printf("No effective message!");
, d( |( t' `# `4 c        }
4 V. [6 a/ q0 D2 d7 S# p% p}# I) G5 S/ j: y' u; f9 {0 q  Y
4 Q. {! }4 _' c4 P% U5 w

, G( `: ^5 G: F6 O5 d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, A/ n, M0 T" n. H8 t, a' p
使用下面代码,对内存使用了mmap函数后:
' ?4 l0 v3 O% `7 T! [, B( D; b#include <stdio.h># l4 i1 H) {& k3 ]: B
#include <unistd.h>
2 B$ @" \, M; f. H  m- x#include <sys/mman.h>
/ F: k1 O- n7 n( j#include <sys/types.h>' C: C% w- u- E8 {! Y9 A
#include <fcntl.h>
2 K( L5 o+ z: m) d4 E% I9 u  n+ C, j$ P+ }6 E6 G
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% l, E0 a6 ^/ E" G3 {#define SHAER_RAM_SIZE         (0x20000)   % @+ K% a1 h! q1 V: z# R0 d+ Z
8 S% |5 r1 L: S- u" @! I4 l
typedef struct
' z" @- ~% P' R; I1 K{
. A9 O; T4 x5 y- M. c* ~# S( k% Z        unsigned int a;
' |9 e1 [9 D1 B! {        unsigned int b;% w" n. x0 M4 n0 v1 l5 ^6 x
        unsigned int packet_cout;2 H! Q& @! l$ w" [3 m- {! }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 n1 w$ X' F5 [0 G+ k

/ A' Q& L8 ~6 I& s  s/ ]+ \void read_MSG_buffer(int *baseaddr);
/ o" d2 b4 R! k# o5 T3 b8 Junsigned int count_copy = 0;: U4 a7 V  Y" A+ I( \

& H- ?* S* m0 R2 C- G" [2 |# `; U: aint main()
5 U8 ~' _+ R$ M7 f0 Q, l{1 r% g" T$ Z- {, W) j
        int fd;
$ |3 D' f6 ?; D: Z+ W# y% A        int *mem = NULL;
# w& ?7 l0 k6 g0 Z
  t$ d3 J6 v- r- B+ o3 U) k4 ]        if((fd = open("/dev/mem", O_RDWR)) <0)
6 g5 V8 P3 _. s  a+ D: t- n        {6 w/ l$ Q: |1 u2 u" ~
                perror("open error");! }5 Z& z" N0 q; F0 D
                return -1;
1 i  c/ ~. Q5 u3 f5 p) @* m        }+ n6 B" ~/ B0 K$ c6 x
        9 R) V9 |" w% @3 x5 ]4 F) G" z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. @$ c, R! t2 {3 T. |6 B
" W& j8 r6 n7 z/ L
        while(1)- O1 l$ K" O4 X* ~9 g
        {
4 j- a! E+ G( k% o                read_MSG_buffer(mem);8 I8 `6 s8 O$ u) H) W8 K: `, [
        }                  h2 O9 ]$ U3 q6 W. f' }* o
}8 l3 G! ?0 N( c6 }
: ]' G* q9 i- C1 ]7 s* }
void read_MSG_buffer(int *baseaddr)) p9 T4 O# Y/ ?' f0 U2 C) \
{
$ ?9 u; ~: k# k+ ^        pRX_MSG_PROTOCOL pshreRAM = NULL;, I# |; L5 J# Q: G0 H8 c4 E( E$ U- T

: y; n5 L* ?$ T1 [) x$ V        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- ]' t& a3 K" v7 S- c" l
2 `( a2 D+ X# J  m$ o$ l) E
        if(pshreRAM->packet_cout != count_copy)  d: S& l- @1 v6 G0 \8 b+ h
        {
. r* \6 O# \& {% K3 y( p                printf("a is %d\n", pshreRAM->a);
' j: w/ P6 I/ L' e                printf("b is %d\n", pshreRAM->b);
4 Q" Z/ }* E1 m! Q8 q% D& ?8 \                printf("count is %d\n", pshreRAM->packet_cout);
# [% f; H+ D( U# j/ f                count_copy = pshreRAM->packet_cout;
' N' _) A  t& @5 V; ^        }8 `$ l. _6 N+ w) \2 ]' J% I; x
        else
: l& g# |, X# ?        {3 T( E) s6 r, U- @+ ?
                printf("No effective message!\n");) J2 T7 w) z" X8 r" M2 R
        }) p; l7 |9 D7 Q
}
! E% z/ x, [3 j, Z7 Y
8 C- n; S) }( v! P* |4 `# R! v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 x1 d- e7 z' b1 n, i( p5 q+ B. o% f! K" L6 f! J

6 d1 N  p" ]7 ~: r# N8 a* p. b6 p! ~) I3 z+ |
, h' ^- L6 ~2 x' o





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