OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5265|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 T5 K( D; W( [5 Q, P: N+ J7 Y- L4 R; Y$ o7 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. \! x. h; S: I/ z#include <unistd.h>4 S, P9 ^4 K, \! |
#include <sys/mman.h>* h1 [+ B6 r- H' a
#include <sys/types.h>
7 N* L% @) l9 F+ C2 Z#include <fcntl.h>' B4 n+ y7 R5 R
( x2 m. u1 ~) s: m3 \' Y( n' L2 i# ?7 f
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 {. b! y" R) ~' \% H- k
# s; h: `; w9 Y% b9 O1 u3 Rtypedef struct
9 E0 g( L3 X' r4 D{
$ \  T& P0 i5 x4 [        unsigned int a;; _  ]! g  {; ]: s. x7 x6 {
        unsigned int b;
8 r6 A/ l8 H- S        unsigned int packet_cout;
7 p! V  k! M2 I+ g8 s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 g. d& E$ }' o# Q7 J

% {& D8 o: G5 H% b, svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# e( @8 x$ N3 H0 Q9 [% Z$ o# Bunsigned int count_copy = 0;
9 q0 x2 n8 l; O! I- [5 Q
( i: ~( Z7 J( c- s& f2 E
8 C4 {3 K: S9 sint main()# U4 h2 }/ _& `- E2 \1 \
{1 w/ a- q* Z" C( X
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ [! Q/ t: N0 i        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" c/ f" q) C; i& ~8 o/ S) o2 F5 b8 U1 C+ x6 M* M
        while(1)1 O5 h' s1 R! l3 C
        {0 _7 D: v- ^, U# ]2 y! q; E- _/ d
                read_MSG_buffer(pshreRAM);* N$ {: z+ y8 n; {' s7 L, a0 f
        }                2 V5 K+ f: B1 ?: K- D
}
4 H* S  C) _2 Q4 @: j
, t% n. |7 J! C. Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* @6 x: A( f4 z! N( B& g
{
- o+ Q) x( b. }        RX_MSG_PROTOCOL buf;* }2 v: ]7 z9 S5 t- }) h
        
- r' r% {1 A, G3 h" N/ t. @        buf.a = pshreRAM->a;) p- a! E6 ?+ B7 O/ Z+ t* V
        buf.b = pshreRAM->b;
. [, R3 s, o6 D0 m) M3 M0 e/ S1 T1 ~        buf.packet_cout = pshreRAM->packet_cout;" V4 A1 G. S- B  g4 e4 f# i5 ~
          O/ C& S5 P) D7 x% R; E+ u) A- O% |
        if(buf.packet_cout != count_copy)
( ]# I, y% q- n( v6 N8 U+ r' Y        {5 F, T# |. r* k8 _
                printf("a is %d\n", buf.a);
& s+ E' s! b/ I2 Y2 H                printf("b is %d\n", buf.b);
! R0 i0 E2 D. s9 _                printf("count is %d\n", buf.packet_cout);3 j% y: S2 c8 X3 \* S
                count_copy = buf.packet_cout;  C( {1 U0 ]; T0 e+ Y
        }
  K( Y# {2 x9 D+ _( Q" p) L6 g5 D        else7 L# C6 c4 `& r; T) p
        {  b. \0 A: N% n2 W2 T8 H6 T# ^! ~8 ?
                printf("No effective message!");
  U' Q. G5 L' O' I: L        }3 J9 Y" s& {- J4 T0 A& @
}
( m" r  U3 W# T! o5 r) n6 D* l/ L  @* l0 M, I$ g4 W
  E, F( A1 A4 H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ P- F0 l: y4 o/ p1 F/ q( Y( x使用下面代码,对内存使用了mmap函数后:  c3 O6 |% \/ h# z
#include <stdio.h># X7 U  l; i, V0 x
#include <unistd.h>9 X( ^# j5 G7 v9 Z$ q- {
#include <sys/mman.h>" H( c' |7 Q- @, m; e8 X1 f4 J5 N
#include <sys/types.h>
  p' M$ S, L+ X( F#include <fcntl.h>
& _$ d5 X7 f" Q% R. g2 Y1 ^' S! H' c5 G/ c* s
#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ v4 k4 U4 T4 g, x+ ]) c* k6 `#define SHAER_RAM_SIZE         (0x20000)   3 N8 S) p+ x) o+ T3 f

) v5 v. F4 s5 vtypedef struct
6 o5 Z  I5 m) z{3 K: j% h' J0 ^6 [9 H
        unsigned int a;6 d( c% m' B6 k( q( s& ?6 f
        unsigned int b;1 S. `& I6 t% C  {( K+ a, D2 u+ U9 {
        unsigned int packet_cout;
0 S' T' y& h) t4 D4 S1 ]  ^/ Z' j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ A4 s. q3 c- X2 K# ?8 }3 m
1 J& ^9 m$ f8 N; b- [
void read_MSG_buffer(int *baseaddr);) _( n8 k5 L& C& g1 g$ o% z+ |
unsigned int count_copy = 0;
) F# ?0 u  X- D2 N2 z/ X! |
3 B$ _7 Y+ ]3 T  bint main(); B( w" o/ d# g9 d7 H9 l4 l
{% o+ l- Z. n4 ^0 a
        int fd;- V7 X$ p+ I# Z1 w- t& H8 `& w- z
        int *mem = NULL;
2 B& J: L6 X: B. x  K. g" E. n! K0 i" n3 C+ T
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 [. j# L$ P3 N+ D( k        {  U) m* C$ s0 ]& A0 [
                perror("open error");5 \# `# m2 ]! D5 b! H/ j$ [
                return -1;
" s) E. w4 _5 R  Y, y( h0 L        }
9 i7 K) R- w1 Q% P        " M2 O0 P( |3 U! X) B, K- ~
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( d. e# g/ X& \5 D5 {/ p5 T: J
        while(1)
4 n$ p8 \$ ?# T% I5 O9 i& ]        {
) Q- ^2 p, i4 j8 ~* i) |                read_MSG_buffer(mem);
' A8 @- i5 J- P4 c        }               
$ Q6 R$ z5 Y- w4 T' {( R}) G; B6 w2 I4 v( _

% j1 W$ B/ |( kvoid read_MSG_buffer(int *baseaddr)
- c1 V  F$ d( z( M# o- o{
8 y& b; V! `& X8 N; R, {+ d        pRX_MSG_PROTOCOL pshreRAM = NULL;) A; y2 ^  V0 _/ l8 g4 C
& C+ X" G5 L5 c3 s8 \3 h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* h5 l, V7 }" `2 q3 u& {& ^6 \% c7 T

& a8 z  Q! A9 A, n! x- L8 d        if(pshreRAM->packet_cout != count_copy)
  f9 _4 N1 L* g& j5 s! `        {$ X3 K$ g: \( y7 J
                printf("a is %d\n", pshreRAM->a);; ]4 p+ ^! r$ A6 |3 r. v
                printf("b is %d\n", pshreRAM->b);6 V( N6 O! w8 z) `: G9 Z
                printf("count is %d\n", pshreRAM->packet_cout);; c) X' V+ Z3 `6 y: s( u
                count_copy = pshreRAM->packet_cout;
" V. o- r; \6 D8 b1 G        }* P2 V, }' G+ ^# X3 Y" f" Z
        else
7 E% S5 R6 P4 ~* a8 G7 v        {  n) |. C8 V, ^
                printf("No effective message!\n");  o/ w" E. U# B
        }
! q- |( J+ W* M0 m! _) G}
/ x& U! Y5 N! i. B* j1 C* L  ^- X. p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' N. X: j  m% O% X0 V
1 T! C- Z# u$ t) T3 t: V/ r
& I) ]% H8 i/ t1 ^9 I% n5 e6 Z% j5 H8 s( @2 z9 g8 e

- n- I, B( u3 G+ J  s) q! s* r4 J' L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-7 16:06 , Processed in 0.038453 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表