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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* A; J& q+ l" C" T3 S1 T' B  W6 k0 \" e) r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- H5 k: p( V' C! ]$ w1 Z4 L0 H#include <unistd.h>1 J- i! O# Z7 w' ]/ c
#include <sys/mman.h>6 D( ^8 p4 f6 z& m9 K0 u9 u
#include <sys/types.h>
5 H7 g! Q/ J" O( y! N; B. u9 c  ~#include <fcntl.h>9 `% |0 [/ C7 j2 c; C; V. b: ?

$ A$ N" p& A* W& }4 W* L- }. Q#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 ^% o8 p. T7 f+ r0 n

: Y0 \# D" ]& gtypedef struct% W( w3 C& m, Q2 ^$ ]" W
{
* T# A9 Z# u# O" t; q; l5 c# t# N0 {        unsigned int a;5 G) Y: g+ z- O- t
        unsigned int b;0 u! O( j6 [9 N! |
        unsigned int packet_cout;
- n2 H- ?$ P1 _" [% B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 p! g6 C* ^: _9 D) I  B/ t
, o0 T  ?/ L; _( M$ n6 a+ pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  V% F$ V, _& C+ [) y+ y& \
unsigned int count_copy = 0;' ~" ^" a8 o. J' o1 I3 r$ Y
8 K" l, Q* S) K- f( \

' M2 u8 P7 v# e) ]. D2 C/ i9 rint main()3 R* x% S( }/ f$ Z% F% J8 x
{
& F5 `: n7 X5 F9 w        pRX_MSG_PROTOCOL pshreRAM = NULL;
: \# M9 P7 M) n& l( ~4 d; s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ f% _0 q( n' H# g( p

8 |, F$ s* R, ?: ^$ R5 O        while(1)
( X2 U5 }7 |  s9 S        {  ]$ E% V$ r* e5 u9 b! x
                read_MSG_buffer(pshreRAM);
2 }2 P7 p; n7 j! D0 C$ a5 R  _        }               
) G- O2 `1 `" M% s! H}0 F! f; B8 Y$ \. c4 R2 m3 ^

9 i& ~( i7 Y6 `, J6 {2 z# mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: p* j7 q# {# t{; o# U  G% _5 |1 F
        RX_MSG_PROTOCOL buf;
, l3 R3 A4 h, W        
5 x. F6 r, ]2 \. {: X7 U& B        buf.a = pshreRAM->a;$ E3 Z1 n0 E8 S, d  o6 S- B
        buf.b = pshreRAM->b;4 r4 B& m+ D. R$ S' f; s; e; W
        buf.packet_cout = pshreRAM->packet_cout;
1 K4 [  ^- d- Z: E# Q& g9 n! i  y        5 ?+ R' w9 p- f6 L5 A! m' a
        if(buf.packet_cout != count_copy)! S) _5 s* U6 Y% b8 b& @1 o
        {, t; B5 a6 v8 e2 W) s
                printf("a is %d\n", buf.a);( r: y% b4 o! j7 v; v
                printf("b is %d\n", buf.b);
3 q) B, u+ l; K                printf("count is %d\n", buf.packet_cout);
% v0 {" F) q' M/ w9 x6 X                count_copy = buf.packet_cout;; U8 ~) p9 a9 _' t) s  s
        }
; O2 C& H3 k6 v3 N7 J; M3 Y        else. a4 }+ _6 x+ c0 k/ V; o& ~
        {5 e3 U9 m' S9 Y7 u* q
                printf("No effective message!");
' n% X+ x4 B: C+ Z1 J        }
; U: h; `  z7 ~6 {) S% @}/ X8 q+ c+ W& J1 s
  r+ ^3 x8 p0 D6 F! M/ D4 G

  n4 O! T  \4 Q0 V; |) i" g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 U& v& P' v' O6 f! A使用下面代码,对内存使用了mmap函数后:$ e7 z- O6 F% M1 n6 M
#include <stdio.h>  l7 _3 h2 i8 Z# X) |3 u6 m4 m
#include <unistd.h>
/ Z5 x8 ~! \' q! k  _+ R1 c: i#include <sys/mman.h>. Z* |; e; E4 r( b, n7 j) L# f; b
#include <sys/types.h>
. s* g- k8 d4 m) j- Y* Z; r' V#include <fcntl.h>
$ U# H1 w  `; S2 D3 T" r5 P1 q- z8 G
#define SHAER_RAM_BASE_ADDR    (0x80000000)
* M; x6 a2 K: I# z5 c" {( z& w, j#define SHAER_RAM_SIZE         (0x20000)   
8 Q: |+ X& H5 L3 C  G
/ v. D2 R8 {/ \/ I. z- y) Ztypedef struct
2 Q* n5 W* u1 U' n* x# u{0 v7 M1 i& o7 T6 D! f# \: o/ B- [
        unsigned int a;
5 |1 l5 J! [3 ^+ E        unsigned int b;
& d0 z, B, }4 Z; ]8 l        unsigned int packet_cout;
/ m+ |5 _4 @6 b; w7 @' ?+ y4 G6 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  f0 f* c! c+ D, q5 X
" [( M# z. J# `- N$ L1 O+ Z2 ]void read_MSG_buffer(int *baseaddr);
& p+ x1 T3 u! Y8 v4 Punsigned int count_copy = 0;$ V! U* ]% |9 ^! r9 M/ R6 @& o
3 p* R2 j" Q- S. I. H, k
int main()
% Y3 ~4 u$ S8 O% X# C. b5 J1 i3 |) T{( \9 P# D4 |; n$ `" u
        int fd;2 @: W0 L, E) P8 k( Q* l0 N2 b
        int *mem = NULL;0 O5 L# A; d1 E
* K: }9 R* \' r7 }4 a' A
        if((fd = open("/dev/mem", O_RDWR)) <0)
0 r3 p( B7 w* ]7 ?+ V+ T$ |* ~        {, R, s. x0 z' v, S5 @, d0 [
                perror("open error");+ [/ w! [4 j$ C- V8 x% n
                return -1;" E: u0 b' Z2 v, i
        }
0 T# k" F; t4 Q        
2 ~# g, F( C6 `# y  `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* U/ i) I$ n7 @0 Y) J

1 l5 Q! m. y% z5 z$ q/ J( V! N        while(1)
- }6 e" n$ w1 S! Z        {
: m7 t& @1 |) ]5 [& @4 A3 `8 U0 X                read_MSG_buffer(mem);( U& R, B, \" U7 a- B1 ^, p, G  {
        }               
6 l( B# b" k0 I! A/ Z, O& D5 X}+ J/ v$ f; a: U& }3 e4 C. I( D2 r. T

- T9 J" e, G' o. mvoid read_MSG_buffer(int *baseaddr)5 b+ ^, U: n3 P$ I/ x
{% {6 n. M, f3 {/ c# t6 v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ N% B; Z( Z# b8 H9 i0 s
, j) ?  N) Z1 \$ w: i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, {9 Z" ^) e. |/ V  n

, P4 @5 C, u$ d  Z        if(pshreRAM->packet_cout != count_copy)6 g# I% b/ |: `: J
        {$ y) S& p$ r6 h' Q) S0 w5 m" ^
                printf("a is %d\n", pshreRAM->a);4 G2 @2 O7 Z& W0 E  ^
                printf("b is %d\n", pshreRAM->b);$ x$ D/ q- [& T# w( v! Y4 E. [
                printf("count is %d\n", pshreRAM->packet_cout);
/ v( I/ n8 C1 |2 c5 N                count_copy = pshreRAM->packet_cout;
+ q4 q5 s& B9 d( m) D        }
- c1 Z- C; f8 M8 ?* M$ k3 g0 O        else5 M9 c6 u* `5 p5 ~
        {5 Q1 C2 g9 L1 k. m
                printf("No effective message!\n");5 q4 b/ e+ E  ?
        }
" h8 X2 X  I% q% p% H/ f2 h}8 _! J! u# w/ O$ s$ t- z! Q
" s+ C# y: Y9 t
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( c' V. }! E7 G" T9 R- t; x6 S1 M7 K/ K. i- k. o6 c$ j
) K: ^9 J8 d% c8 I# ~5 m# K2 l
; X/ ?3 X: W- w9 D
. W  Y, d6 q3 E$ V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 01:59 , Processed in 0.041142 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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