OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" @/ N( A3 f7 M* z3 v/ A' i8 `, l* B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! P/ l6 x7 ~# x#include <unistd.h>0 b! u1 [% S8 o" e2 R  @
#include <sys/mman.h>: d2 a/ m3 j5 l0 t( z' w1 M1 K7 {, L
#include <sys/types.h>( k% K" E9 z) N* q
#include <fcntl.h>
5 C) q/ k9 t5 G1 o/ x; `  y8 k  J% P( l/ B6 f; o8 M$ ?; e6 H
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' `8 c& W0 V2 @' f" S. N& C
5 L, v1 L  n; @7 g& H! C& _- P1 s
typedef struct% A$ Z4 Z' P9 |5 \0 D4 n
{/ K: q' m4 r) e8 V; u% p+ L
        unsigned int a;
  Q+ e; Y4 U, B$ L9 @        unsigned int b;  K. I3 v7 l1 M9 n$ K
        unsigned int packet_cout;
" T( ?2 Q6 }1 `( V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: R$ _7 K- l/ ^9 I
/ _9 |- B% D* y9 J0 ^2 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 K1 `* X' J1 D* H+ k! \" Funsigned int count_copy = 0;
7 {5 J. [4 c9 Y. z) _4 O4 T# R: _  w1 s

# [8 T3 l5 v& K- W6 ~) m5 p/ eint main()
& P; a2 ]3 Q8 A; a{; f7 _% |7 q6 O3 d# [0 {5 @5 ?" H
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 W: Z. r4 C" x; p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 z7 x. _( H7 ]& v7 P* M9 r
3 p/ M: ^" m  A& ^; r# L' v; v2 u7 m        while(1)
  e: v% L* N9 i/ F  Y        {
7 ?" Y4 X* C) \0 E) @4 U% X                read_MSG_buffer(pshreRAM);7 c& y; c5 F  }3 K& @
        }               
2 j, I: |& e4 p  m* R) R% H}9 W3 K0 R! l  n6 D$ i3 i: f

" _- ^- S# v* uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  ]+ ^: [& P, T! g8 {: R# t{9 A2 G3 N" d) Z) E2 Q2 J9 w4 q
        RX_MSG_PROTOCOL buf;3 }" z0 W: o  R3 q/ o
        
& @; e% e: ^! x8 Y9 g' M        buf.a = pshreRAM->a;& y& E" \: r: T: k  L  d
        buf.b = pshreRAM->b;" L! t9 v8 t. i; x% A' \
        buf.packet_cout = pshreRAM->packet_cout;
$ K6 v3 L5 w/ N( ^/ Q/ U        
  I& I$ F7 [8 z. C        if(buf.packet_cout != count_copy)! d4 R" b- ]  G5 Y7 z4 G' Y
        {
% ^! N1 b1 G$ r                printf("a is %d\n", buf.a);
) A, M5 d3 P# K8 r6 F4 O, t                printf("b is %d\n", buf.b);
! f+ G% S4 {& F/ Q9 g* {7 Q                printf("count is %d\n", buf.packet_cout);& ]* [3 R/ `# M1 ^5 B( b
                count_copy = buf.packet_cout;
$ i5 C2 N5 w3 X& h, K7 P4 v        }9 m$ |( ^+ m, [7 `4 A2 N) G* P
        else
( T2 V) A" A* }: b4 `        {
" H* H# H) ]9 O                printf("No effective message!");+ B. q- ~6 P* h/ E7 p: |% ^# ?
        }7 w" L+ v! a; t7 ^6 v, B: b
}
7 t6 ~0 F# R; A9 x5 V( ?/ p  s6 N
  J' d7 f+ [' {  z) p; }. @& |& I. c2 [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# W' q9 a) u# _. n使用下面代码,对内存使用了mmap函数后:1 {% o$ S" d  S5 [" i
#include <stdio.h>2 z9 b7 b  I( y; H
#include <unistd.h>
6 w: @% b% z9 p, F, M( W! M#include <sys/mman.h>0 {  `* A) a! }8 P2 _, F8 C/ i
#include <sys/types.h>
0 ^9 \" T4 Z4 \! U' Y! ?#include <fcntl.h>6 w9 g6 ~4 l' a3 ]! S) ]  A
3 S: u$ C! y! |
#define SHAER_RAM_BASE_ADDR    (0x80000000)! t( S9 H# O& {6 |* v' E( Z
#define SHAER_RAM_SIZE         (0x20000)   : a4 ?' Y' T. G1 X* \
5 x: c  R' G$ x0 H4 t! k
typedef struct4 |! [* j# U: C9 j: T
{/ X! n. o( k! x# l3 h
        unsigned int a;6 d+ P) ?! Q) l" Y9 T
        unsigned int b;
" g1 z+ j. {! ]+ w+ A  ?! |" C        unsigned int packet_cout;4 M+ ]5 T# J5 W& i& D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, g3 u, u* D+ U9 m6 Z' F( i8 P

/ P- d* j! P  ?* k* jvoid read_MSG_buffer(int *baseaddr);6 m/ W; Y, v% M: X; H1 F, ?
unsigned int count_copy = 0;8 g2 J* n9 i4 g* V

% p3 D/ G3 ?0 B4 V4 s" ^+ O8 Vint main()
, Z  A4 w3 g; B8 h1 A3 u1 }{: s! z1 r* O6 Y* M' b. g* Q
        int fd;% s; N" K% `6 \0 v
        int *mem = NULL;
9 y0 q+ ~/ s& N4 o4 M' P$ `0 G4 S/ U
        if((fd = open("/dev/mem", O_RDWR)) <0)) ]& S, z) }0 \! F# X% L# U
        {" e) m5 k) x5 l0 A/ x- m
                perror("open error");
/ R& g7 o: M' L/ W5 O( x                return -1;+ ?; g7 e( v. W5 V
        }
2 H1 {' M! h0 T1 j. t. S. f/ f        
- j& h% q! ~: N5 _# {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 n/ ]& a6 D# ]3 y- I8 ?
. M; `* e1 n( d; b* V        while(1)) ^/ m" E9 G* u' R: {
        {/ G4 m0 _8 s: P5 {2 }. z/ E/ m
                read_MSG_buffer(mem);
3 s* ~. s5 x4 q4 h4 e        }                  W8 ]! H" z& B' F
}
1 m) j9 s+ [: u) \7 y2 Y7 m. N- V3 s# X3 _4 q1 F
void read_MSG_buffer(int *baseaddr)
0 E' I% n. ~) y3 m4 t5 e& e{0 `2 V% N4 U: r/ Q8 p* T0 D
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! ~3 V8 a! n/ N6 O" L" d3 f: H  |& z( R
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ I# }/ j/ \( J# T; @  o
2 w/ i, N* _2 x5 V
        if(pshreRAM->packet_cout != count_copy)
$ H3 x4 d3 A( V0 e/ q1 ^9 h        {8 v, M9 H' h; T  M! G
                printf("a is %d\n", pshreRAM->a);( ?; \: b) i) g" b6 x& z: o% S( |; P, y
                printf("b is %d\n", pshreRAM->b);
8 D; ^2 }. g0 o- m$ j7 d* X                printf("count is %d\n", pshreRAM->packet_cout);
" @6 b' }% _7 }                count_copy = pshreRAM->packet_cout;0 Q2 `8 [. \# Q8 g& U1 p
        }
( E( e$ U2 t, J5 X( w1 c$ q        else
% O, q5 \' D: P0 ^# r/ }5 Q4 ]# e        {
2 D4 P& E, \* Z5 B% x                printf("No effective message!\n");
' y3 d1 P, M* G- \0 T1 E9 l/ k. U        }
& X* B" {7 ~& p) ~3 f9 V3 \5 i}- s+ y, O, R# V! m4 q# p

* A, A1 S- L* F2 }没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ U) j; E& q8 ~- r/ _# g& }6 X7 \3 N
. L( _" k+ P. P' z
4 U& o5 W# m3 P0 _) i% b4 q
' I0 d  U% e+ q( B2 {, u( P
6 w0 G9 d. V% D* `( Y6 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-30 20:47 , Processed in 0.039399 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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