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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 \3 N1 H( F" z/ r0 |- I" V1 W5 |
. ]% ~; [( e9 ^* d( B$ \" f% U4 _" MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># P+ a. w" a# ~8 {% r
#include <unistd.h>
) H1 P9 K+ N% e  t) o#include <sys/mman.h>0 D  |# l8 B: A& t, L- L/ d
#include <sys/types.h>
9 u2 {. x( P+ k( [( M2 O( i9 e#include <fcntl.h>" Z- Y+ @& L1 [; s
/ i; e  v' B' ?9 h
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 [+ U; m4 V) M! H) H/ z
* B+ j, h6 A" T2 D; J/ a0 B! t. }typedef struct
. e6 `% A. G' l; t3 ~! y8 z3 y{5 u$ X! c7 G1 ]
        unsigned int a;
+ S1 |) ^& V6 W. i5 d+ x; c        unsigned int b;
" h* E3 U% o* y' B0 Q2 K5 O- r3 i        unsigned int packet_cout;
+ o4 W' D. c8 [# H* u3 w* n6 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, }! c0 h+ @2 b) ]6 q3 S

& M, A- f% Y7 J# @5 g- |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ p' P1 x: y  S% K4 X* R9 j
unsigned int count_copy = 0;
6 ^2 ^# u3 i$ |8 |. E7 t) y+ c5 u3 D8 a5 q! y4 H6 t

: G* b: l* a) m9 `- Gint main(), g8 F7 Z6 S# C6 R: t5 j
{
' K( A3 C& P( ]/ J& |        pRX_MSG_PROTOCOL pshreRAM = NULL;
  l$ L  q( Y- r$ X3 V. p1 b        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  U7 r" V& D/ i( H5 Y- G" e5 m
% R. A8 `. T. u4 c
        while(1)7 k9 J* h4 T! h. u4 S# C4 ]2 @
        {
/ }8 {8 H. x; n0 v+ e) }. ]                read_MSG_buffer(pshreRAM);
( k* n7 ]6 N6 a        }               
+ B4 m. Q4 w4 ~5 B/ N, D}; J( t) `% F: c( w4 ~& \0 @+ Z+ G
% \$ a) e7 N9 j% X; Y5 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). C2 K# H* G7 e9 }6 _
{
, D$ v1 E( {/ o8 t1 w( A# ?        RX_MSG_PROTOCOL buf;
) n* ~. q; U/ ~( o$ q        5 m; x" ]( B+ J* y3 c# r% p+ \
        buf.a = pshreRAM->a;* y8 D( j: G3 H
        buf.b = pshreRAM->b;6 H6 j- c+ x. [1 W2 f
        buf.packet_cout = pshreRAM->packet_cout;
: Y9 C1 a2 g# P# g8 m        
5 X! g, [9 A2 r, p3 F        if(buf.packet_cout != count_copy)
- G0 w! d* H- U" O3 P- b        {4 B$ E; _+ f/ `  _2 Q
                printf("a is %d\n", buf.a);3 }9 d9 \9 v2 _' \( A1 i3 ]
                printf("b is %d\n", buf.b);7 J* G. l9 X3 l" _8 J
                printf("count is %d\n", buf.packet_cout);( ?. U: ]! J8 n8 c7 ~
                count_copy = buf.packet_cout;
4 S; B1 H- k" D8 K) p        }
( d( {! p3 b. ^7 L2 M) H        else
9 D/ d$ D1 y1 v+ v6 ?- q9 W        {3 y+ |$ s* t  s) i& ]* R
                printf("No effective message!");3 s5 U0 n( l* Q0 p
        }0 q3 P) h' C% s1 W  b
}
7 Z& w" z  K: R3 B/ G, J3 Q# t* s( G6 H
) m" x0 e7 N! J+ H3 M5 U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 ]) _" V  e" i9 V' o: W8 g1 Y9 v3 v使用下面代码,对内存使用了mmap函数后:
. d1 ]" {1 M- ?$ B" @; @% u#include <stdio.h>8 a& A, M& Y8 ]1 D) W$ n
#include <unistd.h>4 H) ?6 Y6 m( B6 v% v  B
#include <sys/mman.h>
. e) g# o' y5 h/ P: ~1 }#include <sys/types.h>8 r/ e( W! e- i+ S* y# ^
#include <fcntl.h>
; C+ Q( H  K  J8 E% C2 L, K
' M! T; o* {  k3 u6 j8 D; D#define SHAER_RAM_BASE_ADDR    (0x80000000), k1 t( B% w9 u: H* l% s' {
#define SHAER_RAM_SIZE         (0x20000)   & N4 M1 e0 u1 c" k) J; ]) {' u! J

2 K+ ?! A: r5 j- f1 n/ @9 N7 N7 gtypedef struct
0 n, G& Q2 }5 v8 r9 n" f; \0 o{
! `6 B' n& K- _9 M2 q        unsigned int a;; b2 z& J% d' Z9 ?; |
        unsigned int b;9 Q4 M3 ]0 o3 }( l: M5 M+ D
        unsigned int packet_cout;
/ X: e4 ]3 q3 |- F. |1 P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. W. _' k) s! h- H' E4 X
% f& R7 j" T' I# ]& g! g1 Cvoid read_MSG_buffer(int *baseaddr);; b, [2 P$ I/ {6 ]! k" D7 o
unsigned int count_copy = 0;
" o' V3 z" c; K* w* ^( P% f( F
% x5 S+ [7 a9 \int main()
. `8 D, K; \  o# E) x9 J{8 U- E0 i1 }+ S9 T; x( ]
        int fd;
0 W7 K4 Y( i1 o        int *mem = NULL;
  {/ r9 M" M3 F! a; Z, m: `$ L( k) R  ?$ k: F- ]; ?) @5 u" R
        if((fd = open("/dev/mem", O_RDWR)) <0)1 Q% Q9 c) z  a0 i3 [, ^
        {1 T' J2 b, d5 E4 p% C
                perror("open error");
7 r. s+ T' q: p                return -1;+ x5 k) J1 T- }& w2 v0 c
        }' W/ Q5 w8 o" M, ]' R* @( P
        
4 V, X& b$ z0 V" Y/ V: @- e/ q5 H  N        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ E0 s/ f; u4 l" H+ |9 Y" q( \. w8 a+ C$ v7 c
        while(1)* ^- |2 p6 c0 P' L4 }* B, }1 n: H
        {' A" l9 v$ |( E1 ~% ]1 o
                read_MSG_buffer(mem);6 j2 ]- @5 U6 t* s! Z3 K2 ~% G
        }               
& ]# T2 ]% g$ D/ p}9 H4 q5 c0 c" P  R8 |2 z6 ^6 c
2 ?# k/ F/ t/ M9 s) L
void read_MSG_buffer(int *baseaddr)% C3 D' r4 p+ C. S4 t3 f
{3 ~1 h; g% I9 P% V( _& E* |- h: J1 L# `
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 @5 i4 {5 C0 x- s

/ j  a, o% ^0 e* K+ W- T  e        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 R" d- @' S  q+ `8 i+ }/ ?- n3 W& V! {$ }" u
        if(pshreRAM->packet_cout != count_copy)
) {7 D7 g; S0 @2 S6 f4 G/ p% u        {2 R! J" r2 T( X8 {2 L$ j; p9 _
                printf("a is %d\n", pshreRAM->a);$ }5 N. U, f) S, |; c3 U
                printf("b is %d\n", pshreRAM->b);
+ q- @; u# x& [  ~                printf("count is %d\n", pshreRAM->packet_cout);0 q! W" u) e$ p% ^6 J. T
                count_copy = pshreRAM->packet_cout;
9 Z3 m. v( k" ]# n0 u% d  o9 F+ e( N        }
0 }6 w6 O, C5 f# I% O1 Q        else
+ N" v8 v# S" i' A* B# t        {
4 ~7 \- L- ^: n9 |! d  f5 x                printf("No effective message!\n");( v, Y! ?. T* |6 ~6 Z: u
        }) y* {& C. g, K7 S7 K2 _& U* M
}
; h# ?1 V) e! A3 u# J5 u- {
3 B( W( y; i7 b* ]& x/ t, T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  ^8 c# P: O% ]6 r; _3 j9 X

0 ]( s  k( s* {% F2 Q  b
/ ~- h' v  Q* b( O! D( ?0 ^5 t8 s  S4 h' z8 a! ]
" z3 d; _" B2 c0 F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 05:58 , Processed in 0.046918 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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