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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ D% _2 P% r0 o& `6 U. {0 t3 w9 \3 b# V
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 R9 m% L+ R/ K4 |5 `#include <unistd.h># P% m- s, [& [
#include <sys/mman.h>
6 J4 I3 e. B5 f: t8 A! {1 o#include <sys/types.h>
1 ~, C8 ^" i  z: S% t) F0 A#include <fcntl.h>
* u, I' N$ S; P* m# G3 M" I7 f5 z* g3 V, }- T
#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 d3 {! @7 `: i! F/ O
/ `. t9 }1 C! B  T$ N/ ]3 c
typedef struct
& @8 r0 e# o; F) {{
# ?4 T6 Y9 x* T) w        unsigned int a;
3 D  a1 I0 `  [: O8 k7 r6 A- G# Z        unsigned int b;2 M! ~3 t6 V4 T1 w  X! Z- B9 }7 `
        unsigned int packet_cout;
! P5 `/ H2 }6 O1 M. F+ h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: _6 l0 o, Y# p

4 M4 s+ T+ ^5 G$ e  E5 H  zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ H" d% m- K! B- Q9 M% |unsigned int count_copy = 0;
$ q+ [. K" Z* \& u4 e* t8 t, F* {) \0 \6 x5 ?

( x& v' M  P1 B4 Sint main()" I4 E* U. f# H% O( B8 `4 r
{4 o' f* b" \8 Y, ^  u' n9 j
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 F) H8 l% z/ p2 S0 c) C% C0 B
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: ]6 t2 @9 a3 N( J+ w

/ M1 B( Q$ G- X  W/ i; f/ f! M        while(1)
; R, Z# h. S2 V" y        {
( M! M- f! s) \# ?                read_MSG_buffer(pshreRAM);
7 Y& @, D6 Q+ A        }               
% W. }7 G( k$ U}- g7 R3 `1 \, X
- `, f& s9 x( Q* n. J( {" C# y" J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ O4 H7 A3 u; c) y- k) e2 L
{
! a+ j. ]% h+ t' z& D! t0 X        RX_MSG_PROTOCOL buf;1 N; Q  {& z2 R
        
. t+ C) o5 {1 Y! X3 F4 s        buf.a = pshreRAM->a;
: }6 T+ ]! N% ~3 b% Y- `1 }        buf.b = pshreRAM->b;1 m2 M0 P" R6 N
        buf.packet_cout = pshreRAM->packet_cout;/ B+ v1 Y& M/ B+ r. j7 ]& H
        5 X' [$ ~& w8 {' s% C9 E- g/ l
        if(buf.packet_cout != count_copy)
" ^3 B- y0 q, m4 V+ |" `        {
. |2 W$ |! m. \; G* w" O+ p                printf("a is %d\n", buf.a);
# G1 v+ `8 ~/ B! b0 T                printf("b is %d\n", buf.b);1 s) Z7 H  A, d8 h* Y* y; h
                printf("count is %d\n", buf.packet_cout);* z' t% i4 L( g# @* M
                count_copy = buf.packet_cout;
' S; X9 s" v+ w' h' u        }9 o7 X0 j: W7 S* l2 q2 H" X
        else8 V/ o! w( E! o! S, I: T) }$ C1 A" N7 U
        {& V  q" M) M( N: y" X
                printf("No effective message!");
1 \- g7 {7 l0 R9 P        }
/ n* `! P+ l$ H}& U% z# r8 ^& [( h4 F# w# _& b
0 V$ N4 p+ y, u7 e

8 ~% R! ~( t* y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 D6 {' K5 C0 s$ [7 ^+ Q5 j
使用下面代码,对内存使用了mmap函数后:
- ]4 y2 D$ n8 G1 Q& D! K& ]#include <stdio.h>
6 k6 ]& @# Q! _( A0 l#include <unistd.h>
6 F/ [+ u( \5 r, r/ N# G#include <sys/mman.h>
( g4 d) V7 V9 p#include <sys/types.h>3 a9 |8 A# m* K4 V
#include <fcntl.h>
4 ^. z& _( t% H) w. b! _9 v% |, \' {3 M& @4 Y' E
#define SHAER_RAM_BASE_ADDR    (0x80000000)- O: N7 c# k4 ]7 L
#define SHAER_RAM_SIZE         (0x20000)   
8 H& R4 X6 d4 b% J5 ^4 L
7 u9 c8 P4 \$ d& i$ k. x5 Wtypedef struct
0 W. N; \: g! U- S{
& x! j5 F, k. C; ]: E; l        unsigned int a;7 J8 W3 L8 t6 v. r
        unsigned int b;
3 O. M6 g6 Z6 ^; o( t6 f. X        unsigned int packet_cout;8 b: ?2 _2 T, f8 C2 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 _1 ~% K3 Q: d3 \$ D+ n0 t2 [
  N' R/ I/ |) B; C
void read_MSG_buffer(int *baseaddr);+ v. v, Z5 _) q# Y
unsigned int count_copy = 0;
0 A4 f2 k: ]' T- b- P. {% [  Z/ {% R9 W% W4 q
int main()+ j" O# @  A: G. X8 K
{& O: b  s" E' D  U! o# n& O" @9 P
        int fd;
& m6 U2 ]7 D' m$ v/ C5 A8 L        int *mem = NULL;7 ?" q8 M+ \. N4 F; N, \

5 [/ m* ^, C  i' C- p        if((fd = open("/dev/mem", O_RDWR)) <0)
+ ^& H  u8 i' j+ U' x$ _        {8 J: y/ ~. T3 y9 ^% o
                perror("open error");: R( w4 H. {! Y# N" V
                return -1;* t, ]7 `5 M0 C7 [" Z  ?
        }$ o* C$ ]# H1 d3 F0 j
        
( p0 ^* y# Z' c+ D% ~9 Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 R# R% E3 i9 n+ R, s5 N& {! c+ F4 C. G9 J* P% r1 e( d( o9 b
        while(1)  J. R: s9 P! U' b
        {
+ l5 v0 H% B! o# i+ }- F                read_MSG_buffer(mem);
& D' @/ E& J0 k6 y8 ]2 q        }               
9 P/ Y9 o; p! g% _8 [1 ?4 j& X}, c5 ^8 a* N+ {" b: h/ ^

. ?8 S! v4 f6 J9 g, |void read_MSG_buffer(int *baseaddr)
. q9 S( o4 E* P- e& B$ }) U. U! ]{4 [4 O. ^5 O, f# e2 v" n
        pRX_MSG_PROTOCOL pshreRAM = NULL;% }+ G0 |; D; M7 E! N4 C

+ g; h4 \3 Q* H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' ], D  Y0 G! g5 m
% r9 o* x# {- C6 R  z" u
        if(pshreRAM->packet_cout != count_copy)
& t% |. C. d  N* W  u: b8 O3 l: i        {; b4 D- `4 s& T
                printf("a is %d\n", pshreRAM->a);+ }0 Y. p6 a( W) l4 Y: ?& }  w
                printf("b is %d\n", pshreRAM->b);
# s5 S" [0 _1 c6 {- A                printf("count is %d\n", pshreRAM->packet_cout);0 I. O0 S" [& w4 x
                count_copy = pshreRAM->packet_cout;
( k' g6 k* `/ f3 y1 w! z3 ?2 C        }( v/ r! ]5 v, {7 Q6 L- d* p. `/ `
        else
# {( D8 I, |9 r, ~& a' f& i+ @        {' @0 U0 E6 D. S9 h& w, s
                printf("No effective message!\n");
/ S( c- x. }& D4 v( |        }; h9 [  K1 o! Q+ _$ b! K& P
}& }4 f% X$ Y4 V1 L- d/ F

6 X1 T. t0 \2 f, g( A; Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, F, z/ K  I6 ?) r% Q- \7 c0 y; u
/ c9 y0 {3 H( I) r& T
6 p. R- I& |1 x

7 r( g( C! Q1 I4 a3 p% b
/ }* e# z4 O& v/ P' f% @! t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-22 03:26 , Processed in 0.043945 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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