嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 Z* |, i- g, T$ b! f: ^; y* y7 |3 e/ j* b  R) D! H  _. C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: H" \1 a6 S/ L9 s#include <unistd.h>- d2 @( \" |# ^( Q
#include <sys/mman.h>
; F. C8 z4 ]& L5 S- V0 X0 `( G1 s5 l#include <sys/types.h>- I. u8 Z* @$ w. O9 ]
#include <fcntl.h>
6 G7 y+ g0 z5 Q# ~
) X7 V6 B: b+ `& {) t8 M# L#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: t  o! ^- ^! e  @8 A
/ B! C/ F. \! x4 ptypedef struct  ?' h3 @7 y% a( l6 K
{; X0 z/ r4 B- K2 ^) Z  a" n
        unsigned int a;( C2 N$ R% p; x0 P% C
        unsigned int b;
* `- I! ]" S0 D8 m) {        unsigned int packet_cout;  F/ _, E0 P9 G& q1 B. m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# D7 @& f% g/ O2 I5 k
- e6 x& K) G; o% I- l+ _7 n9 Z' H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 [3 n4 c0 F4 {& E( _
unsigned int count_copy = 0;7 G( m+ s: Q$ ^& V: G- `! h
- i$ U/ K' h9 T* l9 j/ y1 I3 ~6 i
8 ?2 ]( }+ E) i7 S: E4 Z! s
int main()
$ t  @7 m. f8 R' Y7 C, S{
  s1 I# |# p3 u2 o) [! i9 E5 O7 j) v& i        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 j( P8 W, H0 b2 g& S( M        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 L/ K5 N8 d9 A1 F. }$ I
5 L/ |, A# u! j5 U5 x0 X% g! F! F( r
        while(1)
+ z. B  I% ]7 B+ J7 ^        {
& B4 N; a% X# l% f6 E                read_MSG_buffer(pshreRAM);
  ^  q8 B+ N6 c+ M4 z/ |' D3 l        }               
1 Z5 x9 h$ h/ A& h2 s. Z9 Q  L}
7 G5 b7 p: X. Y8 A! c5 S- F  W& D/ z+ V, W/ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ ^. F, O! Z8 `" f{+ k3 y& ~4 a( F9 u
        RX_MSG_PROTOCOL buf;
$ m& p# L* f3 k. ?5 ?        
. x) x# p# T* t' X8 t        buf.a = pshreRAM->a;
" ^# R0 t3 |8 d7 g1 E9 [8 P  ^        buf.b = pshreRAM->b;/ `7 `" e. _+ i, E' Z$ D
        buf.packet_cout = pshreRAM->packet_cout;, y+ \5 [2 S, N* o3 i) N+ B% p
        % C" o4 U" U2 @( `
        if(buf.packet_cout != count_copy)
5 a' T8 m5 w6 y' T" t% B: j        {
$ l' r5 z  e/ u- B+ G/ D0 b                printf("a is %d\n", buf.a);& c) O) [' ?3 l+ C
                printf("b is %d\n", buf.b);; I7 F  P. b# y) N" u- q2 \! }1 J
                printf("count is %d\n", buf.packet_cout);
5 `+ a$ S3 f# E  p+ f                count_copy = buf.packet_cout;. i8 F1 l7 p2 K0 f% F7 c- }
        }
3 W9 c7 D. N" a' c' R3 _        else
$ Y8 W8 z. n% N3 k4 b' t        {+ C. C/ T5 G4 G6 t4 z! s' b* n
                printf("No effective message!");6 J7 R, Q% {' H0 ^& Z5 H- [
        }
( U1 U; W# O: D. E, b}# u) E7 g3 }% x

: I7 m0 P; O' T4 M+ f6 _2 h5 d1 ^% v. n7 q* @7 s0 N4 u$ o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  t( f( A' ?/ z% U8 q使用下面代码,对内存使用了mmap函数后:
0 G+ e8 Q! X# F" M+ g7 Z& T#include <stdio.h>. a" ^6 n. }% o3 G
#include <unistd.h>
0 i; I# B' Y/ p: g8 Y% v6 T( l#include <sys/mman.h>
( z- I; x- G; X/ a8 c#include <sys/types.h>2 \# k; g6 `+ @/ X
#include <fcntl.h>6 B0 X$ j- z8 c) E  `9 I# _
  s+ X* G7 \- j0 G
#define SHAER_RAM_BASE_ADDR    (0x80000000)" Y- \8 A7 K& ^( I1 |( ~8 u
#define SHAER_RAM_SIZE         (0x20000)   4 a% M3 P9 b" r

- n1 }2 e6 j4 J1 ^# n  d, Atypedef struct
% C$ v, M' D+ X; G3 a; ?8 o$ K, L{4 M+ Y2 d# S$ I- R; }) F" H  l. j
        unsigned int a;
5 z! I- D3 k9 _) |: C6 F6 B. N        unsigned int b;+ n5 B6 p9 [9 t4 f; F& G
        unsigned int packet_cout;+ z' t- r" u4 j( p+ G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& k  J1 c+ T5 E
5 ^. D0 P0 q5 n1 j; T5 V" [void read_MSG_buffer(int *baseaddr);/ N4 \3 h% {- V* B! e4 t" ]
unsigned int count_copy = 0;
6 f0 ?) i# p" W" v1 z, M
4 {4 d4 y& M& ], ^6 H% i1 z8 Lint main()  f/ Y/ X! C4 [5 X2 n" V: V0 q
{$ O( n0 G" w; D4 y$ n0 z
        int fd;
  H7 _- K# j  X$ \, _0 O/ A        int *mem = NULL;, G! x+ P3 J: o% ~* N! @  J+ N
& }6 U! D( B6 c* ^4 f/ [: |
        if((fd = open("/dev/mem", O_RDWR)) <0)  A0 ]# v! B' [9 m! N! k7 k; \
        {
2 J& `$ Q% E- J; H. ~: {+ }                perror("open error");4 c7 \( G* f# D7 E
                return -1;9 w2 c" x& ?: I' O: [
        }
. W: h2 b8 W- M        " {& w+ m/ {) f6 Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 h) C# u  g) c" W* w  i+ ]+ K7 K9 {
8 J2 J0 R9 K& v7 X4 t        while(1)
4 L4 |5 {! q2 I' M/ _$ {        {
) d0 h6 z- l, E5 J3 E' e                read_MSG_buffer(mem);
9 t3 S; n, g! ~! X0 y        }               
2 O7 n8 q# K, A6 W}( @& K4 ]) b! L; s% C; B0 D$ P
% K  e, \1 Q$ F/ O. J6 W) |
void read_MSG_buffer(int *baseaddr)
6 k- B( h' _4 k, ]{% z) E: K: H- Z* f, f1 g& V
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' r9 d6 c$ r9 m. B+ Q: m6 f3 M7 R. ~1 P$ p) z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# y  Y, o* {' ?# V) d. h# L2 ~* `4 O: c7 D0 ]  i$ I
        if(pshreRAM->packet_cout != count_copy)1 z$ B5 C& \! c& K
        {
# V& h% H+ H3 [! b7 }- Q                printf("a is %d\n", pshreRAM->a);
4 [5 ^/ D& M% p, o                printf("b is %d\n", pshreRAM->b);3 s7 C2 {8 ^% X2 W; x1 b
                printf("count is %d\n", pshreRAM->packet_cout);
2 Z# u* ], {9 v6 \: A                count_copy = pshreRAM->packet_cout;
9 R; Z* q, x# `. x3 m        }! ^* P$ s2 y$ f9 _
        else
! v$ W# T* y8 T7 p. O, ]0 [9 Y1 ^        {
: Z. z" L8 o, o2 o# F7 b- r                printf("No effective message!\n");) J5 }: L6 c6 q) A0 ~
        }
1 g3 K# r! {7 k1 b6 w4 U9 p/ S}7 G- e: d; c) K& _  j3 f% z) S  s. c

( I2 E6 _9 d7 C. u% q& t) U$ S9 v" X没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 ]$ n3 C8 q9 j3 Z0 y
9 y/ @6 z5 j+ L. y; {4 u6 H3 d$ t& ~7 j! l  U

4 g8 G! _# z7 H3 B# P
- p7 k* E& N7 M9 c5 v




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