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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 G/ ~: m0 P- Q8 o: x+ X) p* ]1 f; y% ~) \, a( _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* v$ ]) O* y! ^( }# o#include <unistd.h>) s4 p3 m" \  n6 `2 e) o; F
#include <sys/mman.h>
$ H7 C, z* B/ e9 f( d#include <sys/types.h>2 L3 X! g+ I- n9 T
#include <fcntl.h>6 A- A: p3 z; Z2 P' K: \5 v: W

* B8 A; }1 q0 a8 D0 N1 @( _#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ C% Y/ ?- d& b6 H. h
  ], w+ J5 ^6 ]. J- w5 s
typedef struct! V2 F' c3 X+ t5 l) Q5 e& y
{
' Z* a3 n# d7 T/ X! P( y# u/ B        unsigned int a;
' ^7 L& \# |9 I9 J        unsigned int b;' t( v6 C7 o; |, m
        unsigned int packet_cout;
; R6 L! k- N; ^' u# I  a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  S& e8 ?) X$ r8 D" ^$ Q7 C9 R
6 y4 Q& Y7 D+ Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* g8 J4 p) a! H6 g
unsigned int count_copy = 0;; m+ `! X: s! H
. V' [1 U; r2 _6 G4 B0 z) M

' M8 m& \, Q  R9 u5 c' nint main()
; T; c8 K& g+ o2 |% J' }{
# Z: F# [5 w( G( R! w0 |5 V1 e) P        pRX_MSG_PROTOCOL pshreRAM = NULL;# `0 j% c9 ~3 C: v5 S
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, C& l- h: H, {* i

; j9 o4 c- X' I/ y9 r( V        while(1)
! J. d2 t* J- q. C# [: B' @/ w5 _+ ?        {3 A5 j5 a  F0 }( o/ Y1 L
                read_MSG_buffer(pshreRAM);! m# @+ }8 N* \( w/ m8 O9 Z
        }                & b3 ^4 e  z# E
}+ k1 F0 g; W7 w  J! B2 x. a

( S3 G4 [. W: evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: t. F2 |* J, ~! m" G  A{
7 X" B; }+ ?0 G        RX_MSG_PROTOCOL buf;
$ H5 c0 e# @8 r. v( t6 @7 j  m) H        6 I; a; x; ~; Z5 A7 t  g
        buf.a = pshreRAM->a;
* j/ T, w( D% n/ l5 j3 g- `        buf.b = pshreRAM->b;( ^: k) P3 _8 ?; I8 x
        buf.packet_cout = pshreRAM->packet_cout;! t/ Z, q, \' D: o9 b4 b) e3 w
        
4 R# m9 e1 b. @        if(buf.packet_cout != count_copy)7 s9 A* e; m. K+ u( q
        {3 D( h* W! y: n+ }' p% c
                printf("a is %d\n", buf.a);
8 ]2 N, [: o! p                printf("b is %d\n", buf.b);6 c6 y/ S) h1 Z) x
                printf("count is %d\n", buf.packet_cout);: ~6 k5 O6 l  N2 z( S
                count_copy = buf.packet_cout;. y; m" F/ [) X4 ^
        }
1 b# J1 w5 j2 M. J        else
0 d- i* w; w" U, T2 U        {0 P4 q5 W8 P- g/ q. a) h
                printf("No effective message!");$ f1 {3 K9 W1 \3 q
        }" ^* h( S: k4 z' x5 Q/ P* [
}. _# J; a0 [+ O8 d" z1 E9 Q
6 z& j9 A' R4 L+ N; c' x& |* Y
5 V4 H) O3 ^0 l5 ]  V. ], v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 g+ |, b( ?* k* k1 H; k6 S
使用下面代码,对内存使用了mmap函数后:
8 I7 |! h  H  l" S) I, W6 J- W#include <stdio.h>
* b+ @/ M! }2 q. a0 Q7 Q$ G- W; l#include <unistd.h>- H: y1 x# {: J2 ^3 e7 s
#include <sys/mman.h>
" E2 j* R5 W- A9 j#include <sys/types.h>
! l5 j& T% x* x* U; q#include <fcntl.h>0 c% L* @( j( |
2 m, m/ M+ j4 X" X
#define SHAER_RAM_BASE_ADDR    (0x80000000)9 ?' @/ R. z/ u6 L  O, b6 D
#define SHAER_RAM_SIZE         (0x20000)   
! ]# N7 M9 x5 R( k5 [2 G+ B
2 H0 K( U4 m# y9 Ztypedef struct$ L6 P# J/ Y- y0 p2 O% T
{
4 D$ N: Q& Y! b        unsigned int a;7 [2 f+ H' e5 D( B/ |
        unsigned int b;1 s0 ^1 b' r- Q0 W" U* E
        unsigned int packet_cout;
5 A3 d, Q2 c4 s* G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* i% |' U8 \$ V2 \3 ~; T/ [) j1 c0 M: q/ M: \
void read_MSG_buffer(int *baseaddr);
% e8 k+ \) @) L& \% vunsigned int count_copy = 0;% |3 n) z" h  u- o6 U$ _  J. {
: i$ J1 a4 r- E$ b) g
int main()
1 v8 d( E% A! u/ X{2 X  s2 H) k6 I
        int fd;5 K1 V" B. U2 D. `% a/ V/ n% k# G0 Y( `, Z
        int *mem = NULL;# W5 J$ p0 i4 B
& d; P; ^; E7 E# C" j
        if((fd = open("/dev/mem", O_RDWR)) <0)% x, c4 s& |4 F3 V6 O, S4 y
        {
- w& p7 W3 @6 @3 V( q3 ^                perror("open error");) x( h3 m3 c* r1 ?7 ~- u" t/ F
                return -1;
% K( w$ C. y  F0 a0 V        }
5 I# i4 p9 [/ F' \. X, c        
1 ]  C$ q1 D& j' R, N- ?        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 Q$ x! V3 B5 o) t9 v$ M7 G# z+ K+ p$ P. z) q
        while(1)
  l/ b7 V) x& O$ `        {
+ N3 d  F7 E  y8 {7 u                read_MSG_buffer(mem);8 F  S* }( ?) o; @: M
        }               
, Z( z/ a8 ]3 @4 j: a0 R7 T; n}
. I* `3 H. c6 `
' t8 r, U% I- e9 t2 P3 P9 _+ ], d, E5 Rvoid read_MSG_buffer(int *baseaddr)5 }/ H+ J, G* Y  s& z/ k( m
{( J7 U& B( b& _' p; v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! V" O$ d/ D  T2 o5 S* o  e& h$ ^0 p" m- w5 g$ i9 [
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ M% T7 g% P. n) W
! V! q, g# i2 l0 {3 y! S
        if(pshreRAM->packet_cout != count_copy)
/ M; @$ S! d, ^9 f' ~5 s4 a        {
+ c# c6 i) ]& V  S1 r+ ?5 \  Z7 n                printf("a is %d\n", pshreRAM->a);
3 i9 a) t9 b8 G# a# ?$ _& X                printf("b is %d\n", pshreRAM->b);& m4 f# z+ P$ m; M) j. {
                printf("count is %d\n", pshreRAM->packet_cout);
2 _- H: J+ h$ Q5 I, Q0 z9 h                count_copy = pshreRAM->packet_cout;
" s- d  x1 P+ a# H- x$ P4 [        }" _4 T. W7 r& ?& @$ w: A5 q
        else1 H3 G4 ~5 x! w5 Z; f1 {2 A
        {* u: p6 g% A+ o4 ?1 \; g
                printf("No effective message!\n");
( T4 g" l. N% E1 `        }7 n) q9 q6 a3 n/ F4 e
}  Q7 {; l; N  S2 K. j/ e
* e- M5 Z* U, Z% s6 N7 w3 u8 H/ r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& E" u+ O! |1 V7 L5 a
4 F1 N% U6 @" M' b: }
. `: r- r  D: e5 `2 n) L
0 c9 c; a' A5 s( a5 K, M8 r
& @$ I* P2 h+ O/ F( i! S: h3 k$ t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 15:13 , Processed in 0.037242 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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