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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& q, T: w- c3 @, K9 ?, _* x0 Y; {; N' k5 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  Q3 T, r/ f/ G# [* d$ Q2 a
#include <unistd.h>
& E5 V1 b8 B: z& ?#include <sys/mman.h>
5 b& A- Z2 G) y/ P1 J0 I3 L#include <sys/types.h>
- K* ?+ k- g/ |#include <fcntl.h>, W4 I4 e: T5 s
! ^; F/ @* M" D- _9 u9 L
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  _- Y( ~. F! |1 S; s! y  d1 x; Z8 J, n# Q% l$ o+ H
typedef struct
2 V  o% J: o: ^9 U5 F- C! y{
5 R% T! V6 ^! s9 P8 O        unsigned int a;
3 [# A1 V( ?1 b1 U* V/ ?0 o        unsigned int b;3 l$ d. Q+ G  r
        unsigned int packet_cout;: {" B( n* I( b. T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  L0 l! R1 J% ~6 S

* `/ U3 ~# v3 Y# _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  l' a6 N. [* ~5 {: l9 K+ {
unsigned int count_copy = 0;. G4 ~. `, }; j) L7 w
/ |" ]3 F# j( ^/ h  p
! L9 C  p1 z' |* j* U- m
int main()
! L: t- I* ^( y. S9 G5 P{
. w9 Z% {/ l) t. t% K        pRX_MSG_PROTOCOL pshreRAM = NULL;$ g  g2 y: {" |! a# _
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' k0 B$ _! l/ ^% ^
0 W( W' S' a. S  I
        while(1)
4 a" I8 e6 O+ W6 `        {
0 h) z. K# ?6 R" i                read_MSG_buffer(pshreRAM);
5 J7 w, n  p& Z- e        }                : o$ R! I2 _: N
}
; ~: x0 h+ o6 z  V/ \& I# z
  M7 j1 o. T7 \/ Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: _9 s2 `. _! @5 n; Q{- S$ I* Z' F  y- \- ~4 Y
        RX_MSG_PROTOCOL buf;
! f9 r, u( ^/ A& @/ a* x        
( r2 [" S/ F+ T7 Q        buf.a = pshreRAM->a;
0 V0 o! C2 ~+ i7 @        buf.b = pshreRAM->b;. d( F* r1 V  F) m) _9 E+ `, N
        buf.packet_cout = pshreRAM->packet_cout;
; Y* z* O1 y2 [4 B( `        4 b# ^$ |2 g: I8 ^: }5 ^& g
        if(buf.packet_cout != count_copy)2 y$ L: M/ m9 ]7 R$ z0 E
        {
0 l' w& V; I* e) r2 x/ u& b                printf("a is %d\n", buf.a);
( W  K- Y& _9 o/ \' T6 Q2 D                printf("b is %d\n", buf.b);( |& [; U3 h- h" T
                printf("count is %d\n", buf.packet_cout);
$ A' n( o& w' ]: l  l4 m* l                count_copy = buf.packet_cout;4 D. @, m1 |2 g* h
        }
% P: {% L6 U  h        else
& w9 {. Q! C; e- Z) s+ V' h. a        {, D9 ?6 E2 q! a2 k0 r
                printf("No effective message!");
4 h  T$ z2 M  |1 F# f        }
, a5 r, C; c9 \- q( z}) k3 A: V" z( ]  d: ]6 ^

  q; b, a6 n2 X+ X% s2 \% u7 t/ L$ x& m4 u( M- s. Y, l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: }) z$ F5 M6 _7 a9 w' R
使用下面代码,对内存使用了mmap函数后:- F1 y# B4 z5 R1 l) W" d( y; ?7 `
#include <stdio.h>
3 T! _; t& V* X2 s9 T0 O( N#include <unistd.h>
  t/ h8 F" Q+ c( I, N; r: H- O/ i#include <sys/mman.h>( H1 V( }+ d- Q
#include <sys/types.h>
9 }9 N3 U" E0 l. U#include <fcntl.h>
3 t% o/ X1 `/ m& v1 J5 @
  q4 |  s& o! C+ O- y+ q#define SHAER_RAM_BASE_ADDR    (0x80000000)" v7 g$ P% {0 f( i/ W$ Y
#define SHAER_RAM_SIZE         (0x20000)   : N" G4 Y2 q. g' ^1 f6 ]

4 Q: ~; N4 S8 D7 W. ~' S- Ytypedef struct
) I" ^" E, z1 x( I{0 N- q+ t; W* J$ h
        unsigned int a;. Z7 F4 ]% f0 |$ j) C
        unsigned int b;
% ^8 C. n- Z  ?' ^5 S7 d) F' |( M1 z! \3 j        unsigned int packet_cout;7 {; j& B) Y/ F2 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& y; Z8 w+ |4 G+ u7 x. p- p6 v/ g. ^6 K' p- T6 ^4 i3 v4 C
void read_MSG_buffer(int *baseaddr);
8 n! J3 @) Q; U/ ounsigned int count_copy = 0;
  S. J3 C# u: v7 o" K8 z& N
, X8 f# z9 t8 V; @5 T4 N" ~int main()# l) P8 c8 E: G! y! Z- b! ~
{0 P7 s4 a! ^6 |& A5 O0 {
        int fd;
. I# ?* C1 `7 W+ c2 N5 O0 _/ Q        int *mem = NULL;2 Q- A6 g& Q; M4 s5 F, {) `
% M! f  c" k% f8 x9 o8 @6 F# o' z
        if((fd = open("/dev/mem", O_RDWR)) <0)
1 `) o* V' p& _" }0 e        {/ [7 |: l% c+ O$ D- K& e0 R
                perror("open error");0 v& V% i- @& k/ c1 [4 w
                return -1;
3 ]$ q, D5 j9 f6 e/ y- L+ }/ I  Q  l        }
* Y% {0 T3 J4 K5 k  H" e0 u# Q2 ?2 |        
* a# i/ u8 i* W1 E2 G& @" _. n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. D5 @8 d% f4 Z, |+ |( c" f; F0 N
6 p7 S, v5 ^2 i$ ^+ B        while(1)
* `! F, h% a/ J3 W( z) I        {- g* r; d! j9 e3 S
                read_MSG_buffer(mem);
7 ?+ N4 m+ H1 u" S        }               
3 @% Y" o3 l; |: c3 |}
  o$ B! w9 N, Z: K8 O$ M  z" C5 y# ]( u/ c% ~
void read_MSG_buffer(int *baseaddr)6 c& N& a; d0 E+ c/ T' b+ ]) I
{
$ e. U' R5 n* F, G/ W        pRX_MSG_PROTOCOL pshreRAM = NULL;; N9 d' i9 Y; C: |7 S/ F1 y$ ~+ Q
3 z* t  L' E$ i" C" g) X( e
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- X. `! P9 K# k% r" u$ d; S8 c8 A
: ?  G# m  H- v9 c# H
        if(pshreRAM->packet_cout != count_copy)
' t! t7 C0 o; g* Q& ?( D        {
' T. u, N9 l% V/ C8 [                printf("a is %d\n", pshreRAM->a);
9 ?! o6 m" h3 _5 |+ r                printf("b is %d\n", pshreRAM->b);; }# e( v) q4 f
                printf("count is %d\n", pshreRAM->packet_cout);2 z7 [1 @- ]% G4 K
                count_copy = pshreRAM->packet_cout;. H7 R* o# M) I% L; l/ X6 i1 y2 }
        }
. |' n1 ^1 s$ S5 D# }        else
8 u4 T$ O7 B& f/ l: D, Q        {
% K$ S. m) \& R- }4 x                printf("No effective message!\n");
+ s1 W; W8 Z7 `0 c        }
  W/ C7 W! e9 ?}% y# R6 A6 R3 T
9 V  C: X, c& w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  P7 I; a+ t5 S+ j( d1 P

$ t; n. K7 s. K. T, z, }6 K' |5 Q- [

/ [1 ?: d' {) t6 B. h; ~! g1 K# Y: \, i% [) H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 05:37 , Processed in 0.040733 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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