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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- f& K. v) M8 Z# p2 F- d- Z& a9 R9 ~& x! X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( Q1 g' T2 h1 o$ C#include <unistd.h>4 Y( Z0 g! C8 i$ O" [+ N
#include <sys/mman.h>
& S# Y" H0 O, X! H#include <sys/types.h>. r/ Y- ]( b( d# Q; G) L
#include <fcntl.h>
& d, s- ?8 p- j- [0 W
2 R+ ~7 s' Z# G+ s4 w- \#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ ]5 a: Q# u( s7 z% Y$ w2 @- O" H! \: t( o. x6 R
typedef struct
& N% u! U5 j; O5 V6 A{+ }6 ^# R3 m* h% F, ^
        unsigned int a;
* |( \- F% Y. y. t        unsigned int b;1 \. N, B6 ^* J+ s+ I9 C
        unsigned int packet_cout;+ L& A' q% S! e$ d" R/ O% k4 l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% `1 J. R6 C$ {4 l7 _4 @# a: k! A  ?( s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 u. J* O. I! {; Q! s7 L. `9 p7 `% Z
unsigned int count_copy = 0;
% R2 ~/ k* c( b: p% j, A
7 P1 S7 |# X$ B4 J; i: }; Z: g7 u( ]: X# Y/ K5 ]
int main()6 k- n4 n. F( ^2 s0 Y& |; e
{6 u# e! \+ w3 O9 T; ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;# G- u, i0 e+ [/ h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 L8 `5 `) Q. ?7 w

; U# ^0 H" f( V' @% }, S        while(1)
% |6 q) `0 ]9 ?9 U2 @, C% G  P) w1 K        {
$ S$ I0 U# J5 {                read_MSG_buffer(pshreRAM);
9 @) q  W2 ], m% Q$ x, d        }                " f( P# R1 e3 w
}
) j/ Q6 e9 I3 Y6 l6 s. G+ Y
( L/ {* \0 L. N! h! J7 e0 L8 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; J; ^' R( e, [4 ~! o{
' K% n/ U: f2 j3 J" `        RX_MSG_PROTOCOL buf;  V6 C9 s. m! G( Z
        $ Q; t$ Z5 g9 d
        buf.a = pshreRAM->a;+ x: _7 T9 A3 F) o
        buf.b = pshreRAM->b;* Q9 U/ z# s5 r  X
        buf.packet_cout = pshreRAM->packet_cout;; y7 N' N& w$ _6 H6 ]
        3 |& c. i7 {# C4 v6 i4 y# R
        if(buf.packet_cout != count_copy)
1 A4 W1 c! F1 e8 C- V. B7 i        {
: I  F& J4 u0 s: J" _7 v8 A$ x9 o                printf("a is %d\n", buf.a);* l: u8 X. Z3 o2 Z; A3 D! C# s3 _* ^# g
                printf("b is %d\n", buf.b);
1 d9 l% E% m  e) w                printf("count is %d\n", buf.packet_cout);/ {/ \; |$ d5 l! C7 h
                count_copy = buf.packet_cout;% D* c2 Z! g; M) A2 R, y
        }& T4 _# |4 l% c9 R
        else
# J/ W  d1 n% d7 Q        {; E/ c$ h& W) p; d; X7 m) w& W# O
                printf("No effective message!");3 y/ R7 }# a. E3 }' q8 `0 v& x
        }
  i% p; J5 v+ N/ r, x$ a  X& v" b}
* w5 o/ ^6 B6 i' U' @) f1 n& ?2 [& f; v) z7 q  K0 ?8 v# f! X; D3 t7 V9 ?
+ j. h# F+ f! R* I: D6 {7 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; [( _6 H$ N! w" M1 _" ^2 E
使用下面代码,对内存使用了mmap函数后:
- ^& m% e% o1 |: [; |  T2 d3 n% U# O4 \* w#include <stdio.h>& }2 Q7 R' F7 ]
#include <unistd.h>
+ a: f% `" o9 C/ N) Q+ y  a. S0 Z#include <sys/mman.h>3 r6 r& r( p& r0 g; N; K# z
#include <sys/types.h>
, F8 c5 A( [1 g' W#include <fcntl.h>
0 h; [& [, P9 o" o# B
; ?1 l4 _( i% J2 K: P% F3 {#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 ]$ D1 E: C4 n& s5 A#define SHAER_RAM_SIZE         (0x20000)   
. @, W' @* \0 m5 j* I/ [
. C3 @+ h$ N+ z5 Otypedef struct
! ]4 W1 H! a$ d8 b4 L. h2 k! C; v% u{8 i# T1 V" ^+ O, _
        unsigned int a;- [7 t: {+ `& t
        unsigned int b;! ~& L# ^( F, ~
        unsigned int packet_cout;
5 w1 ^! B" w' h0 o9 V; Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 q8 y8 h9 E1 V, k" p
2 a1 q; ^) b% G5 G& J
void read_MSG_buffer(int *baseaddr);
" s9 ]) Z6 `- E1 [1 n+ {/ yunsigned int count_copy = 0;, j6 k' @3 i& O+ E2 b; N+ `8 Q
$ l8 W8 x9 ?2 S# L2 q3 w! g* T! j
int main()
9 Z) L+ }8 V6 s' `3 @{
1 K' a2 d/ s6 M7 H+ ?6 {3 l' m        int fd;
  q8 ^3 M1 Q! ]$ [* v        int *mem = NULL;
9 @4 l5 @! Y* [6 g+ S0 g8 L! G: F5 `/ i  p; M6 x$ |
        if((fd = open("/dev/mem", O_RDWR)) <0): W4 m6 @5 n) z0 }
        {
; p+ a: z7 _* Z' G  b: G                perror("open error");* z$ ]2 I4 v9 i2 J
                return -1;
5 b8 u2 n8 V2 `: F% E* l1 c0 V        }, G4 Z" D1 V" L& p6 r; a
        
9 f: n- v. R( d2 {$ t: i        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% D6 z% J& z/ m% J( k7 d
8 h! o1 O. h& i( N, Z        while(1)
( N: j7 b3 Q6 T! d2 T        {! e' i6 i' I4 _& h" B
                read_MSG_buffer(mem);4 q; o5 U) {( k, x- W. U
        }                . Y) n2 a- a+ M! z+ i5 k5 U: z
}7 @" c, ~" h) @/ N& v+ I* Z
5 m& n2 I  [! l6 L2 m. Z
void read_MSG_buffer(int *baseaddr)4 E  U; w3 e5 _
{! g" u8 w0 U. F% F4 u, H* p( ^; |
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" |) }" X: ~/ i& v1 X) L, Q7 @% X8 Y  h7 J8 C; D7 l
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 e- v2 X5 f, j' u+ Q$ l9 C( Z

( l% w( _0 e% J$ S& n        if(pshreRAM->packet_cout != count_copy)2 y$ t9 t8 P0 |% E9 A* ^( T2 R
        {
  W3 X* M& c# n7 e9 q7 r                printf("a is %d\n", pshreRAM->a);" R) n; |1 ]6 c% t
                printf("b is %d\n", pshreRAM->b);
3 z, G0 M( ^* c  Y7 r, n                printf("count is %d\n", pshreRAM->packet_cout);7 Z+ A  [0 Y1 l) b! N7 U+ n, C0 x
                count_copy = pshreRAM->packet_cout;
1 g* n# c# ]7 M) j0 n5 B9 D        }( W) o1 ?. G5 y8 u
        else0 R" t/ C2 U+ s5 ^
        {. R# C8 }* |  v" v5 W/ H
                printf("No effective message!\n");
! ^8 S# D0 a7 T' u        }
1 d  j5 p7 n1 n7 p( y4 m}0 H# ^$ z1 r5 s. J) g8 T7 j- S
/ l5 q9 r% o# J1 O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) f0 S! C% L( i( ]
2 }: p3 s  k; k) T% S9 p3 t2 c# |. I* O' ]. Z. Z. }

4 g4 w/ k5 c% G! ]. X" q  w$ ]: U
7 g* x( A9 q% C7 L$ e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-19 19:34 , Processed in 0.038214 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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