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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ N8 B* K" }- B- q
# h/ ^% ~2 o' n- g, oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  Z. O" P! H( i2 D+ _7 Y#include <unistd.h>+ {$ }0 `% x1 z& a- z$ R+ A
#include <sys/mman.h>
) Q1 I4 E" q: O$ x#include <sys/types.h>
3 @' C+ B2 N$ a* ^2 L& P#include <fcntl.h>$ A/ H: d- q3 ~

# T* a% b' c, _#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) {4 E: ~, ^, [0 F5 H- @6 E7 I: ?5 H1 N" q* T2 f
typedef struct
$ t' s; @" q3 n4 _, G4 C$ R{) i7 P1 ~0 {5 x% K! l8 o, d3 J
        unsigned int a;  D  O% y% y- o% {5 L
        unsigned int b;$ B: x5 g4 K# h9 Y# ]0 ^8 a7 m) y
        unsigned int packet_cout;5 W, {6 j* F( C5 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 J- ?2 b& d# _8 ^. o) c/ ]/ K7 L0 u+ F, N$ w/ t- G9 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 a# J. a+ z2 R0 w3 w
unsigned int count_copy = 0;; w: R. T* y9 r* V# x9 u# d

* o1 i& k8 ^% G5 n1 D8 C& |/ J8 J2 p4 G. T- D* ~+ w1 |  ]* E: C( ^* w
int main()0 M/ T6 g8 H: X5 W
{$ a# M# C+ @$ e! R' f. A- i) F
        pRX_MSG_PROTOCOL pshreRAM = NULL;# N4 e( V& ^5 [& l5 h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# w0 B* m0 z# _' i# D& a0 n. |9 l
5 P' p1 |% W+ t/ j        while(1)5 H( h; d  N$ E. X6 T- b9 N) _. b
        {
3 _- u0 k& h, x8 s# r* ]' J9 w' k                read_MSG_buffer(pshreRAM);
( H* m8 Y( h5 z        }                0 s  R3 @4 w* U5 D- Y0 a
}
3 q) f+ a( C6 k2 f+ n  A1 t9 b
' i* O+ a4 u% S0 l6 Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% \6 h- G( K+ o$ T{
7 t* q. E" o7 O        RX_MSG_PROTOCOL buf;
+ N9 f1 p/ D. I! [- q$ c        
8 }$ w6 @# Z) `) `& ^' Z- a" q1 [        buf.a = pshreRAM->a;  g3 T. }0 B9 n$ x" t4 |$ U* b1 I) S
        buf.b = pshreRAM->b;$ S$ w% H( K6 d8 d+ Z
        buf.packet_cout = pshreRAM->packet_cout;, f0 ?4 v! ]1 x
        " H8 m% k- r3 H7 I: G; z) J+ i% \
        if(buf.packet_cout != count_copy)) K7 h9 t7 C$ P8 _% |" Y
        {: W+ {% }3 E  F6 S4 G
                printf("a is %d\n", buf.a);
9 X: h8 r- T- Z                printf("b is %d\n", buf.b);% K- L8 V9 d; z2 S' ]; T
                printf("count is %d\n", buf.packet_cout);
7 q# {7 U, U/ b6 K. J$ r                count_copy = buf.packet_cout;
: W/ Z4 A+ W4 M7 Q        }. L' M" n$ `$ J0 E& d# @# H
        else
' H3 j7 l  ?' k- \% w- `) r        {- G- k0 |# n; R$ S6 r# V4 N
                printf("No effective message!");+ y( a4 U3 k( M6 z  w4 z1 v
        }
. d! T4 _$ j( t) k0 V9 A}
: L2 o# Q0 s5 w' U2 q' }* N; l  H/ f8 b$ ?; B! d7 Y

6 }8 j* F7 @$ U& T% {0 ?6 C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 h8 n' D0 i  i
使用下面代码,对内存使用了mmap函数后:
/ B) r- p' ~( }& x& ?#include <stdio.h>
5 g, I( q+ ~& `, w+ T6 U# E; z$ M#include <unistd.h>+ D8 M, [3 b! V* p* i' R7 O
#include <sys/mman.h>7 Z0 E, z  _$ J% j% t
#include <sys/types.h>" B1 s/ \& O# o' L: p  h/ W. K  b
#include <fcntl.h>
. q) |# H1 q- l7 ~& z* G5 H5 \
: c8 q7 i" k0 h#define SHAER_RAM_BASE_ADDR    (0x80000000)
* c( S0 O) x' a" n$ q#define SHAER_RAM_SIZE         (0x20000)   , u- M; U. E7 X9 X6 ^

, Z" E0 t$ U9 Z* O' W; xtypedef struct5 Z! X$ S0 J1 d- N1 @& \
{5 D" V  M$ Y* T/ X% ]
        unsigned int a;8 C8 }( o9 F# {* N8 p
        unsigned int b;8 M3 [) Y( e" M  d/ ]' `/ X# _" f
        unsigned int packet_cout;6 i. K' X% C1 q6 ^. t) ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  Q& [7 d. E- c. z7 v/ |3 I

8 K$ c  J4 @$ qvoid read_MSG_buffer(int *baseaddr);% c, F; j" l4 F
unsigned int count_copy = 0;5 p; `! N5 l- I$ g4 e
- J# s: M+ J$ v: Q
int main()
" u  }6 I9 g' K9 m6 v: p4 s6 @4 V, V{
& @  P1 B1 B& N) `  @" M3 K$ P        int fd;
6 o- f- u& ^8 e: d5 C9 e# \        int *mem = NULL;
) C! R# w8 z- \( X4 E+ b4 Q; v. W' @+ K3 z$ s( a
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 ?7 ?5 @- Y% s& W) ~2 m* Y        {) J. f( e: g8 n4 P
                perror("open error");
1 y; o% {8 I) c) f) J3 T" K6 z                return -1;7 v7 R5 R7 u- g* R
        }5 W2 S: W) {9 b
        
* B3 ?) C9 _0 B        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 q+ c9 b% ]3 ]: D* U* y3 e4 L) e& X
        while(1)
( Q0 O/ p! U6 x% M% y        {' [, ]) V- d% N6 J" s7 r- V
                read_MSG_buffer(mem);; F% t5 J- s% e9 ]: E$ C
        }                  }& `8 e# A5 q8 n1 g7 [: Y( H
}
: d$ X7 w0 O2 P+ F! O( o, k
2 b/ ?- p8 p1 kvoid read_MSG_buffer(int *baseaddr)
- @+ W8 _+ r: }+ Y6 z, y{8 Q* {; y; M% A" r1 c
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ o' v, o5 c1 |3 z" B0 I

, t' ^0 ^" C, P        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 i1 i1 j( q9 v0 c! [7 |
+ C; {3 o& I2 E8 m* d$ K        if(pshreRAM->packet_cout != count_copy)9 J! ?" N1 k7 d# p6 O3 |  ?
        {
1 }2 f; z0 ]# ]3 r: K9 |0 {0 ]                printf("a is %d\n", pshreRAM->a);
- R. `) c/ W2 F1 v" \' G                printf("b is %d\n", pshreRAM->b);
* W% B: U8 q# t6 e7 G+ c                printf("count is %d\n", pshreRAM->packet_cout);
' ]4 c- ^1 W. G& l6 `: L. y$ J                count_copy = pshreRAM->packet_cout;! S5 g6 A/ `% F0 D4 ?- f0 N
        }  m! n2 x! K: `5 q, S) p
        else
+ ]$ R: }+ ]3 X# @2 D- V        {
4 |4 {0 Q3 D$ K$ R7 g, v: m                printf("No effective message!\n");
  z. B4 e6 X0 S; U5 I2 k        }
7 j  V& r+ [" H$ x  I8 p  n}3 g/ b; Q1 y1 |6 R4 d1 v( y; `7 W3 }

3 D, a; Y2 a- {- t: K1 B( r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 V! Q1 t  I" Q9 D# g6 g# L0 q$ _
! p3 C4 ]4 h  b$ P6 P
+ v/ o5 a7 ~, D1 b0 r
3 j" ]5 v  h- ?* Q/ g2 ?6 L' ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-13 08:08 , Processed in 0.039866 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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