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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & o8 C( N) U2 a' Y) B  y" w
2 ?/ H% p1 `% i8 T6 J+ @) t9 f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' B3 l/ W8 c5 X; s  o1 N; n
#include <unistd.h>
( ~+ e5 l5 s4 |" O#include <sys/mman.h>
! e' c7 A; ^' W  \: ^+ j, W5 n7 h#include <sys/types.h>3 Q: n) F' A2 n$ _) f
#include <fcntl.h>  ]$ `% |1 Y8 _" T

  Q/ {7 O  c5 ^0 n+ j: `#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 @8 z' X0 u$ c0 X1 ~
  |0 [* J. p8 R$ Mtypedef struct0 V* l( A# o/ e- ^3 `9 p3 a
{8 C3 G+ O* r5 w9 D! f4 g
        unsigned int a;" b$ d, \, O0 l% S+ A
        unsigned int b;
" L9 L# \( u  }* A, F) a. i        unsigned int packet_cout;3 t# R: ]5 n4 Y) j+ R) ]% n! K/ j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 K0 ?8 _$ q+ K
4 X6 K1 i. V0 `. D. r( V3 r! U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! P9 P) f% R7 l7 u. z
unsigned int count_copy = 0;8 K5 y6 y* R$ e  _- l; j9 y6 }
+ R3 e2 p& v; e4 G

, A+ e2 l) z8 O1 g( s0 x' nint main()7 g, `! I. ?" ^2 I% }
{
5 t5 Q: \+ Y9 E# Q+ U( W1 P        pRX_MSG_PROTOCOL pshreRAM = NULL;
, `1 ~" O& x) e3 A        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ M+ ?# S0 M% X
& l7 G+ M; S8 \0 p# K        while(1)* ^5 B- l$ `5 D$ T* n' w
        {
, g+ T# H, H- S                read_MSG_buffer(pshreRAM);
' G9 M# A* F0 n9 h2 G( z& c        }               
, O2 k+ l. r4 j( `}  J; i; m3 {6 Y( Z" z

; n% _3 t9 v8 i# J  y- P* evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# l/ Y# d; _, |( g/ N
{
' a+ r" U' i: D7 T2 p4 g7 q- @" @        RX_MSG_PROTOCOL buf;7 ]6 g* w  C6 }& T! o8 L
        
' V4 P! s8 v" ^( Q: H3 Z  {) \        buf.a = pshreRAM->a;
  g, a' _0 P# i8 w+ v1 j1 o        buf.b = pshreRAM->b;
: i/ D- A7 l- z7 p) O  u: @* C        buf.packet_cout = pshreRAM->packet_cout;) p$ f! W7 t% N9 N- y( ?( V
        
; m. d! }6 e/ o, c2 Y        if(buf.packet_cout != count_copy); ~6 W* S' {3 A; ]+ H0 G
        {4 ?% D+ z. i, O8 E- S, q
                printf("a is %d\n", buf.a);
: z$ N8 B( M& c; [3 [) D                printf("b is %d\n", buf.b);. }3 ]9 A$ i  T) s2 _" e, \
                printf("count is %d\n", buf.packet_cout);( c$ I! ^3 D# \% N/ M- Z1 d# F
                count_copy = buf.packet_cout;! A  D" L7 J' e8 L) @
        }& s" @) `& `+ g. K- ^+ D+ S# ^
        else
+ _7 t: k, u$ N( d        {7 y8 u# ]* A. T# S, {
                printf("No effective message!");
/ m' x' ~  M/ [2 ~. }        }
: F# j3 E) _4 z1 h/ \}
& K# P4 E% b5 x! l+ z- a
% ?1 d3 _' ^& R0 C) e
0 |2 L- m" J5 F9 v$ A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 P/ e. T+ s* H4 F使用下面代码,对内存使用了mmap函数后:; \( A% p" v1 ?0 e8 g
#include <stdio.h>
9 l" u% O# r0 t#include <unistd.h>
5 V' k  H3 `( }& e#include <sys/mman.h>
' e; d' }4 n) ?% w1 ?/ C) E, m& l#include <sys/types.h>
8 b/ s) Z) k. _, Y+ `6 I) Z. F#include <fcntl.h>9 v6 g. s, x9 n* Q

( {" `8 l5 D! d3 P' T#define SHAER_RAM_BASE_ADDR    (0x80000000)7 `$ d7 E9 U0 t; D
#define SHAER_RAM_SIZE         (0x20000)   
* |, p) \. \5 k  ?# I
) ^1 _7 R( [4 \. i; b4 ftypedef struct# _  S9 s% B2 i1 n
{8 H7 K# ?/ ^1 S% m8 T
        unsigned int a;$ @6 e# \: Q- h, a4 g1 O2 q
        unsigned int b;* N& Z% @* d" }4 Q* w: H
        unsigned int packet_cout;5 m5 S% y9 f5 g1 m% H9 e0 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 O3 Q2 O0 }9 q
7 G! o' C/ R2 t: @$ F
void read_MSG_buffer(int *baseaddr);
8 J. G; Q& n( y+ c9 `unsigned int count_copy = 0;" {( h; K: O1 b
  E8 s* ^& C/ A9 x& Q, B! L" f( t7 K
int main()6 d$ M4 R% x# z# l* ]4 J  m
{' G6 ^, u. P. _
        int fd;3 H) {3 _4 w8 H  |# w
        int *mem = NULL;7 }8 ?! R5 m: B% Y  n9 q9 I
! n" G9 i: f' s/ i( L
        if((fd = open("/dev/mem", O_RDWR)) <0)" l  H  \, H9 C. p9 C
        {
$ v9 v0 Y* F5 S* [" w7 U                perror("open error");
6 B. ?' T# f2 x! ?6 t6 o* t                return -1;
' {! m9 o4 I0 S3 t5 T$ {        }
: |; r. i  I8 V, u% B5 r; U        % Q% ]  t' V" v& D" R$ @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) K1 g& T: j6 D$ ]2 r, y" b
+ T5 T. n7 V2 g  E! ~5 d
        while(1)
0 i( _* S; y2 h! g        {
4 T7 ]( G+ H7 b/ K6 l% d' P                read_MSG_buffer(mem);
, G8 V0 C$ ]* Y8 f( D        }               
$ [+ I# D# P2 U8 t" \! C6 x}( u+ g6 j% K* F

6 m4 A& ]4 n& g# u6 [+ C+ P) tvoid read_MSG_buffer(int *baseaddr)6 N2 f6 x' Y1 |5 f, Y
{6 q4 g: w, |' C$ E7 a5 t) l$ `+ t# S. h
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 W; a7 X$ [# T- R. O# _9 n$ c0 o: x! ?7 E# K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ p0 K) V% D, i" B7 V: i6 A/ o
5 a  K" `% d3 ?& U" Z  `4 U        if(pshreRAM->packet_cout != count_copy)
. v8 e+ h0 K, @( x! f- h: W: Z        {
) A! \" R; b: q# ]  q9 A4 `                printf("a is %d\n", pshreRAM->a);
3 L1 p* L/ B  T" w) C# P                printf("b is %d\n", pshreRAM->b);
8 ^% p8 ~% M& C0 H" c" C& Z                printf("count is %d\n", pshreRAM->packet_cout);! T! I5 s; ~' `$ a$ N
                count_copy = pshreRAM->packet_cout;! u! S! U% v4 b, l
        }4 ~6 q+ Z$ F+ }% V, O7 e
        else
2 }$ ]5 Y5 O5 P4 G0 [* a* x/ K. q        {
5 f- Q8 B+ P. G: t& o3 j                printf("No effective message!\n");
5 Y0 ]2 u+ X6 ^" j6 W; l        }4 r$ \. F0 Y7 A& d* K/ G9 y" {8 H
}8 w4 x/ D2 y' j4 O
7 U% U) L; U) P4 m( i, b* {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 M' K. J- t" t) m7 j/ X
) i# ?& @0 B( t* E& F- p, F, W7 r2 Z4 p1 I8 J
0 R2 E# N- y. a! L4 m2 ^+ U$ q8 b

1 l; w- t. }- Z! ]# |5 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 00:17 , Processed in 0.038751 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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