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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 P! o, @5 |; S3 ?; @6 |
4 D" s6 O3 W5 b$ G  b; c2 ^. @* P4 j' n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. a6 @/ K8 E1 H' K) S7 F- B#include <unistd.h>
  i) \5 Q/ _" E% e( }8 m! Q( }#include <sys/mman.h>0 ~! W/ w4 H8 r# e2 l9 P1 d
#include <sys/types.h>. }$ j: U* A$ x0 u
#include <fcntl.h>
8 S5 `% T! D3 v, T- {8 A7 ?) j! b2 w; j) y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ E1 }+ L! k+ ^
* p( U4 I; u3 Utypedef struct* F1 ?/ _$ @) `7 f" |" Y
{: K4 e$ [6 M# r- ]( b5 y
        unsigned int a;3 n$ N( e% s5 I
        unsigned int b;
2 J$ W* X$ A& Z1 g        unsigned int packet_cout;: C' t$ l% [2 A' f9 h. [# {, p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 I6 y* P3 x3 y0 W7 S* {4 ^* H
- y3 o) z8 ^- C" d8 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: N' X. R8 c( P. k3 ]; Runsigned int count_copy = 0;
4 T3 h2 v# ?- B- |" g4 h$ n  x7 R: a# K! m0 R
6 N' [5 k8 y2 J; Z" w
int main()
2 h3 f- G9 A/ z  Y  }+ D9 u. v- o{  _+ g: P1 X( Q6 M" x: g& L
        pRX_MSG_PROTOCOL pshreRAM = NULL;! c% e% }, W9 H9 ^' I! H/ C$ h7 d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; k2 N6 w$ Q( R- u9 O( B% a3 Q" S9 c- D2 ~0 `1 a
        while(1)" S% F# `+ ]  V' l7 d4 M
        {
3 w: W3 p5 h6 H                read_MSG_buffer(pshreRAM);7 W: Z! y- l; o: l4 E6 {
        }               
; t. R  z. q: E2 j3 j  W}
8 G1 X& Z: c1 p1 M
  Q  l2 S, j2 |! |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ c- c) M4 |; q3 r3 p  M4 z4 V{) r; `* W# ~% Z; V: S
        RX_MSG_PROTOCOL buf;5 z$ v$ R. k  [8 h' H
        
' l) U4 h! ~; K; a- S% F        buf.a = pshreRAM->a;
4 q8 q. W+ I3 z0 Y7 n0 U4 c/ g        buf.b = pshreRAM->b;+ u9 ^: A* X, U. y$ E
        buf.packet_cout = pshreRAM->packet_cout;/ ]" U5 M+ h  W1 S7 E" x' G
        ( _# J/ X8 P; h; f3 Y- a7 F
        if(buf.packet_cout != count_copy)7 f' H3 a; h2 m* J7 I  L" C  k. G
        {
# y% I5 X5 f2 k! [; H                printf("a is %d\n", buf.a);
- z! F* z% Q) n2 v# g                printf("b is %d\n", buf.b);/ _; _3 d, f6 T) ]5 Y3 c" O* w3 L
                printf("count is %d\n", buf.packet_cout);
3 z5 S. y& y( P' f0 `                count_copy = buf.packet_cout;
" p# s2 }8 X! w0 N: W- f, V        }$ d6 c% V5 s6 j; @1 h! l
        else6 D- r+ H6 J$ e  k
        {
7 K4 t5 U' H" ~/ e, ~) _( I                printf("No effective message!");
+ j3 Q' D2 r) C/ v: c9 Q' x8 g        }8 x0 U6 E9 o: T8 w) I# b: L. m
}7 v. E( j$ I; J5 Z+ A- @2 e

: e" e/ i3 {- v2 H- O5 r! ]
! @; y3 A& Z1 G/ |* q& m' Y/ Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" j; S, B; v8 m7 M3 B! L使用下面代码,对内存使用了mmap函数后:; B, ^/ {7 A) }$ p% H; h
#include <stdio.h>8 M$ Y; D( V9 l! b( o
#include <unistd.h>+ S! p  B- R& D+ c% Z
#include <sys/mman.h>
4 ]6 [1 T* O& v#include <sys/types.h>
% x+ R! [9 s1 ^#include <fcntl.h>
( V% M  Q3 Z- d: e9 i  ?2 {; C8 T, n! v$ `: X3 J" v6 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 c) ?5 ]9 y2 Y( }1 M#define SHAER_RAM_SIZE         (0x20000)   4 k5 B6 h# m6 |
  _7 {5 B; X% l/ u1 i. _. q
typedef struct8 T/ n% S5 L2 m3 h3 |3 ^
{
6 D! f8 Y- K, r$ }        unsigned int a;# t- c. R$ e! x5 G: Q9 [' O& I
        unsigned int b;' u$ ?# J9 w9 N& X- l  [7 [
        unsigned int packet_cout;
9 w7 w5 B$ y5 K9 N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ M* \8 D- v8 c# ^  B' a  N
  s5 @$ A2 a6 x# F7 i! x0 y8 Nvoid read_MSG_buffer(int *baseaddr);
1 R, I; K6 h% E* y( _unsigned int count_copy = 0;
0 T6 g5 p3 x# c2 ?0 X& l
" ~, t; b/ J, {0 Z5 X0 Hint main()
! p  f0 u" v# q7 H{1 \6 E; v# b7 W2 t( [. W3 O
        int fd;
$ ~% c8 j/ ]; z+ P" N2 O; a* B        int *mem = NULL;5 d( r7 |& y: s) |  e

1 g; Q# s- F# M        if((fd = open("/dev/mem", O_RDWR)) <0)
5 n3 c* @; Q% ]4 _3 Q        {
% i% f3 K6 \  A                perror("open error");% e4 L) r' n$ Z, D' Y
                return -1;+ ?6 Y( r7 q. {" i% W
        }  `6 s" ^) `  n9 @. E
        + T( X7 s/ ^5 t
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% a5 G& N( O) e) {
5 @4 k& M9 Z& D& s
        while(1)
+ d1 ~( P6 M+ r  z3 E7 h        {
* S# a1 m8 v! H* c- M1 N                read_MSG_buffer(mem);" g) V9 e: m4 n# o* D1 V
        }                0 Q2 Q5 X5 t* |: `
}
* q0 H  C+ x( L8 }1 c, J2 y4 ]( n; A) z/ M- R0 ~
void read_MSG_buffer(int *baseaddr)1 A6 s+ \% a% {! N
{
0 {$ l! _8 v( j$ |9 y( ]        pRX_MSG_PROTOCOL pshreRAM = NULL;
" f" ~$ ]4 W/ s: L0 X1 x8 A( O/ e; @( F# t/ z" F
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; F' W" N$ F: G
! W) u# I3 ?6 L8 s& Q6 s        if(pshreRAM->packet_cout != count_copy)
% w' w2 U: J: q" F& l) k# h        {; n6 r& b! I% [, T/ ?9 z
                printf("a is %d\n", pshreRAM->a);) j% J* ?) z$ S) Z  i: p" J: I
                printf("b is %d\n", pshreRAM->b);) p6 h) @! u8 ~4 j0 S7 ~
                printf("count is %d\n", pshreRAM->packet_cout);
6 [7 [" F2 k; L$ x                count_copy = pshreRAM->packet_cout;+ ~% \2 g5 f9 \8 U: U6 y* e) z
        }
3 S) g9 @; v. E4 L4 X        else
0 o/ b, V( E/ {$ C. X7 n2 f        {
6 m; F- Z5 N/ A1 m+ [                printf("No effective message!\n");
. j  r1 v* j; {8 ?        }
7 c/ }" H# U: T" K9 \" S, U  x3 X1 H}1 c; ^, C+ g8 r8 c* _9 n
4 @: n3 o& o) i+ N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ o/ P3 v4 @+ u- m) T

! \$ r4 N& A# x, J) w8 c! @$ y5 c) P- l: V1 f

3 T- ]9 }# W; ]; M3 d  ]; @* F; h6 J. W6 a0 R' p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-7 22:28 , Processed in 0.039439 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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