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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( M9 E5 t  @& S  c
+ `1 d6 Z5 H* b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 {( W# i3 W, }& \4 _# ^; W#include <unistd.h>
. `0 c9 M, x8 w$ H& b4 `#include <sys/mman.h>
0 d4 b3 E1 F1 y/ |4 `, ]8 k#include <sys/types.h>
1 B% f0 e7 z" L0 _3 M' m$ B8 m6 d#include <fcntl.h>
" G$ |3 B; ^  T5 E" i6 j7 F5 w5 U4 X) j( t, Q7 T2 w' W3 V3 P
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 G8 H, ^& o+ J! u$ Z' r
6 i; [5 b1 }! N9 c' Y+ B) V( q
typedef struct
3 t' F3 L& \( z2 G3 V# A{
% ~- a9 T" x5 m3 r3 a1 U  _* v        unsigned int a;
2 w3 G; V- u7 @8 }8 z+ b6 s7 I* F        unsigned int b;
4 s8 B1 `, p/ e        unsigned int packet_cout;' y6 o; d3 V, F: n# N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! X5 c! p) z6 O& W
8 b. u. m, j& zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 K/ z( ?# Z8 j2 j6 Tunsigned int count_copy = 0;
$ m; I, {- s# {3 ~3 J& S. @" i" i7 T
4 C/ \) d6 a- z8 E/ x
int main()
: S+ X% \+ i  w+ n0 s* w2 {{
: {3 P6 Z4 \  y        pRX_MSG_PROTOCOL pshreRAM = NULL;: q7 r. o4 l* f' ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- |7 O8 R7 _2 _. ~8 P$ G" \2 K* K" g. [  F. ?. n: |5 G  p
        while(1)
5 B- q/ N5 A5 j. R: N9 r        {
! d! q  a; \: s                read_MSG_buffer(pshreRAM);) ~' n6 `. M2 m
        }               
+ l6 ?; m2 W8 i8 B+ ?; ]$ r" V( h}# R6 t0 j* l0 _, ?$ C" e9 B# N5 b
% }$ R9 j- k" A+ F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! ~0 B* Q% x# L4 B5 U% f+ E{& o3 }8 O/ \1 ^: @1 P/ I
        RX_MSG_PROTOCOL buf;
% n6 U8 `& r# |+ \        
) X* L% R" k6 C* M7 d- y/ p8 z        buf.a = pshreRAM->a;6 q) z; G1 g7 i7 o  r
        buf.b = pshreRAM->b;" X1 n1 K; U4 U8 z' {6 e7 l
        buf.packet_cout = pshreRAM->packet_cout;7 C! \! M, `; h! \  M& }# j' V
        
! @& ~6 X/ P5 c0 g9 _+ [        if(buf.packet_cout != count_copy)
6 H" F& @/ b0 n& }  D0 X* }& w        {. x: Y" ^  X1 f9 V5 `
                printf("a is %d\n", buf.a);
# p9 X5 m5 ~. r) z                printf("b is %d\n", buf.b);9 G% t' e0 S5 p  e3 b
                printf("count is %d\n", buf.packet_cout);
' D$ s2 R- Q& \# A/ i  B                count_copy = buf.packet_cout;
. U3 j: N, b$ J; I2 T2 P        }5 E6 ]) H1 A3 b! Y" \1 w
        else* f! T: ~; O) x+ m0 L1 o
        {5 b, I% ?/ q! L% c
                printf("No effective message!");
# f2 w4 n1 j' \% w+ J        }$ ?! I6 m- x5 a; o# J
}
* H/ N. j. _! C5 }" C; V" j# v6 `. s( T; [" o- v1 X% q8 h

/ m7 w6 }; F! Q4 z: X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. g6 J: G) g$ F# Q; r) ^1 D使用下面代码,对内存使用了mmap函数后:
) l. `4 @' p8 t$ Y0 {0 S#include <stdio.h>
  [$ M; G" \! H! e7 `/ Z" J#include <unistd.h>( D3 Q6 V" n, H6 ^
#include <sys/mman.h>
6 [! Q; g" ~, e4 {8 O+ }, i0 R: n( w#include <sys/types.h>
) F' s* Z, q; m5 m) i#include <fcntl.h>6 S  \; ]8 J: X4 A) [( I! {0 f+ G

; I/ t- V1 N2 W, P  @#define SHAER_RAM_BASE_ADDR    (0x80000000)
) I# }2 p' z. o: k! Q. [& r#define SHAER_RAM_SIZE         (0x20000)   
4 f2 j* F3 t3 _; Z  A3 S/ t1 B! {& x" I, i+ u
typedef struct+ S! C8 @8 \$ `* B+ C6 Z8 X
{& W" w8 `' j& a
        unsigned int a;
& y+ T0 q+ D" K5 W& H$ U4 u        unsigned int b;! t$ }: u7 ~1 ?* @3 g
        unsigned int packet_cout;
7 p* v& ]+ V$ W  ~/ e  [9 b4 ]" Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! e: [& r  Q$ i/ E8 S0 ?! ~

9 I- o* |* X" W, f' Gvoid read_MSG_buffer(int *baseaddr);( j+ u# w- C5 M) c
unsigned int count_copy = 0;
) Z2 |3 i" _  g( j) h% H# M$ H$ X
int main()
& t: ~" Z9 Z2 x: |{
: n! F7 z! h  n; C0 E; }: t        int fd;; V3 ~7 G' b8 ^" S0 d
        int *mem = NULL;
$ T, }. O8 K( M. I, n+ o
% O5 `$ ~, e$ t  Z% Q$ k2 m5 w        if((fd = open("/dev/mem", O_RDWR)) <0), y2 j- J0 S& `6 q$ \6 B3 y) X; q
        {
, |5 }/ ^2 D( F* K, P. d. Q0 `                perror("open error");
7 F8 H/ k: j1 v/ c& `, U, K                return -1;
. [7 h% w# i& ]* e, q# k  N8 e        }
; \, ]& @, x- Z( j2 \        
3 l9 Q- n# Q( u4 I, i7 n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 g2 b' @; h; d" b: j) V. O
' E% A" _0 c1 X  ], s        while(1)
% [) v( u! @3 i' Z" p        {/ f+ c" V3 v2 n2 ~1 k  f6 J
                read_MSG_buffer(mem);
. e# q: l/ R8 C        }                ' I4 A3 Y8 T! L5 |) x6 y
}
+ u6 c# T; L+ D+ b4 x9 V$ R- [
9 v5 k( ^( _! t" L* pvoid read_MSG_buffer(int *baseaddr)9 K# x3 u# E7 `; M# v6 V
{8 n$ d  W( r/ ^1 y6 _. T
        pRX_MSG_PROTOCOL pshreRAM = NULL;: j1 n' @. ^8 b) s
, y. l8 I/ @: E4 O, A
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  }. h5 \2 I2 p

6 L1 `7 \2 r4 J) e3 z  ^. C' C        if(pshreRAM->packet_cout != count_copy)
% q2 Z( z+ s9 i  V% X' b        {
9 e' Z4 x. }8 \                printf("a is %d\n", pshreRAM->a);
7 p, o3 Y  [5 P+ {0 e8 C                printf("b is %d\n", pshreRAM->b);
  b8 j) m- U, E6 `$ [* `                printf("count is %d\n", pshreRAM->packet_cout);6 V' ]9 Z& o9 @( m' I
                count_copy = pshreRAM->packet_cout;
  A$ I% Y5 b+ Q6 v% ]- [1 {        }% t% U  E7 D4 K, Q
        else
9 T& j2 x5 z& p1 b4 c1 Y        {
( R* m. T8 d+ I+ _. U+ k                printf("No effective message!\n");
0 @0 R3 L  `" T& B8 n        }
; c: O4 L5 i* \, t}
" C# o& v: Q, T. J0 M% S+ [6 p; v; v* q, l# f5 `1 _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: q* ?7 W5 u  d
; r; }3 u4 r0 D! x  N! B. O

/ N" g5 L4 y5 ?; r( N: _+ @( b) D- C8 B6 z' f, ?3 ?! d

8 J) o6 x6 f- v1 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 00:07 , Processed in 0.041163 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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